Cod sursa(job #1154439)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 26 martie 2014 10:20:42
Problema Congr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#define LG 5000000
using namespace std;
int P, v[600100], poz[600100], sum, ind;
char buffer[LG];

inline void Citeste(int &x)
{
	while(buffer[ind] < '0' || '9' < buffer[ind])
	{
		ind++;
		if(ind == LG)
		{
			fread(buffer, 1, LG, stdin);
			ind = 0;
		}
	}
	x = 0;
	while('0' <= buffer[ind] && buffer[ind] <= '9')
	{
		x = x * 10 + buffer[ind] - '0';
		ind++;
		if(ind == LG)
		{
			fread(buffer, 1, LG, stdin);
			ind = 0;
		}
	}
}

int main()
{
	int i, j;
	freopen("congr.in", "r", stdin);
	fread(buffer, 1, LG, stdin);
	Citeste(P);
	for(i = 1; i <= P; ++i)
	{
		Citeste(v[i]);
		poz[i] = i;
		v[i] %= P;
		sum += v[i];
		if(sum >= P)
			sum -= P;
	}
	for(i = P + 1; i < 2 * P; ++i)
	{
		Citeste(v[i]);
		v[i] %= P;
		poz[i] = i;
	}
	
	srand(time(NULL));
	while(sum)
	{
		i = rand() % P + 1;
		j = rand() % (P - 1) + P + 1;
		if(v[i] == v[j])
			continue;
		sum = sum - v[i] + v[j] + P;
		while(sum >= P)
			sum -= P;
		swap(v[i], v[j]);
		swap(poz[i], poz[j]);
	}
	
	ofstream fout("congr.out");
	for(i = 1; i <= P; ++i)
		fout << poz[i] << ' ';
	fout << "\n";
	fout.close();
	return 0;
}