Cod sursa(job #1027610)

Utilizator RaduStefanFMI - Radu Stefan RaduStefan Data 12 noiembrie 2013 21:26:51
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
using namespace std;
int v[2000001],t[2000001];

void det(int i,int l,int X,int Y,int Z,int V,int c)
{
	v[i]=( X * c + Y * ( i - 1 ) ) % ( l - 1 ) + 1 ;
	t[i]=( Z * c + V * ( i - 1 ) ) % 2;
}

void sdo(int v[], int left, int right,int k) 
{
	int i = left, j = right;
	int tmp;
	int pivot = v[(left+right)/2];
	while (i < j)
	{
		while (v[i] < pivot)
			i++;
		while (v[j] > pivot)
			j--;
		if (i <= j) 
		{
			tmp = v[i];
			v[i] = v[j];
			v[j] = tmp;
			i++;
			j--;
		}
	}
	if (left < j && k<=j)
		sdo(v, left, j,k);
	if (i < right && k>=i)
		sdo(v, i, right,k);
}

int main()
{
	ifstream fcin("toys.in");
	ofstream fcout("toys.out");
	int n,m,l,S,X,Y,Z,V,sol,i,nr=1,c;
	fcin>>n>>l>>m>>S>>X>>Y>>Z>>V;
	v[1]=S;
	t[1]=1;
	c=v[1];
	for(i=2;i<=n;i++)
	{
		det(i,l,X,Y,Z,V,c);
		c=v[i];
		if(t[i]==1)nr++;
		else
		{
			v[i]=l-v[i]+l;
			t[i]=1;
		}
	}
	sol=l*(m/n)*2;
	sdo(v,1,n,nr);
	sol+=v[nr];
	sdo(v,1,n,m-m/n*n);
	sol+=v[m-m/n*n];
	fcout<<sol;
	return 0;
}