Cod sursa(job #1503385)

Utilizator theprdvtheprdv theprdv Data 16 octombrie 2015 00:13:27
Problema Curcubeu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cassert>
#include <cstring>
#include <ctime>

using namespace std;

#define MAXN 1000002

int N, A[MAXN], B[MAXN], C[MAXN], ans[MAXN], next[MAXN];

inline void w_int32(int &k, char end) {
	char lim[16], *s;
	s = lim + 15, *s = 0, *--s = end;

	do {
		*--s = k % 10 + '0';
		k /= 10;
	} while (k);

	fputs(s, stdout);
}

int main()
{
	assert(freopen("curcubeu.in", "r", stdin));
	freopen("curcubeu.out", "w", stdout);

	scanf("%d%d%d%d", &N, &A, &B, &C);

	for (int i = 1; i < N; ++i) {
		A[i] = (A[i - 1] * 1LL * i) % N;
		B[i] = (B[i - 1] * 1LL * i) % N;
		C[i] = (C[i - 1] * 1LL * i) % N;

		if (A[i] > B[i]) A[i] ^= B[i] ^= A[i] ^= B[i];
	}
	next[N] = N;

	for (int i = N - 1; i; --i) {
		assert(C[i]);

		for (int curr = A[i]; curr <= B[i]; ) {
			if (next[ans[curr]]) curr = next[ans[curr]];
			else ans[curr] = C[i],
				next[C[i]] = B[i] + 1,
				++curr;
		}
	}

	for (int i = 1; i < N; ++i) w_int32(ans[i], '\n');
	//for (int i = 1; i < N; ++i) printf("%d\n", ans[i]);

	//fprintf(stderr, "%.2lf\n", (float)clock() / CLOCKS_PER_SEC);

	return 0;
}