Cod sursa(job #37418)

Utilizator moga_florianFlorian MOGA moga_florian Data 25 martie 2007 08:49:19
Problema Reguli Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
using namespace std;
#include<fstream>
#include<stdio.h>
#define nmax 2000005

int d1[nmax];
int d0[nmax];

int main()
{
//FILE *fin=fopen("toys.in","r"),
//     *fout=fopen("toys.out","w");
     
int n,m,l,s,x,y,v,z,crt;
int i,j,k;
memset(d1,0,sizeof d1);
memset(d0,0,sizeof d0);

//fscanf(fin,"%d%d%d",&n,&l,&m);
//fscanf(fin,"%d%d%d%d%d",&s,&x,&y,&z,&v);    

n=400000;
l=1231231;
m=123456;
s=537434;
x=30893;
y=92779;
z=36919;
v=47797;

long long ud,ad;
long long ut,at;

ud=(long long)s;
ut=1;
d1[s]++;

for(i=2;i<=n;i++)
   {
   ad=(ud*(long long)x + (long long)y* ((long long)i-1))%((long long)l-1)+1;
   at=(ud*(long long)z + (long long)v* ((long long)i-1))%2;
   
   if(at)
      d1[(int)ad]++;
   else
      d0[(int)ad]++;
      
   ut=at;
   ud=ad;
   }
   

long long sol;
int ind;
if(m%n==0)
  {
  sol=(long long)2*l*(m/n-1);
  i=2000001;
  while(i>0 && d1[i]==0) i--;
  if(i)
    {
    sol+=(long long)i+2*l;
    }
  else
    {
    i=1;
    while( d0[i]==0 ) i++;        
    sol+=(long long)l*2-i;
    }
  }
else
  {
  sol=(long long)2*l*(m/n);
  ind=m%n;
  crt=0;
  
  i=2000002;
  while(i>0 && crt<ind) 
       {
       i--;
       crt+=d0[i];
       }
  if(crt>=ind)
     {
     sol+=(long long)l*2-i;         
     }  
  else
     {
     i=0;
     while( crt<ind) 
        {
        i++;
        crt+=d1[i];
        }
     
     sol+=(long long)i+2*l;      
     }  
  }
  
//fprintf(fout,"%lld\n",sol);

//fclose(fin);
//fclose(fout);
return 0;
}