Cod sursa(job #36907)

Utilizator moga_florianFlorian MOGA moga_florian Data 24 martie 2007 12:13:23
Problema Reguli Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 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=5;
l=101;
m=100;
x=y=z=v=s=1;
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;
}