Cod sursa(job #262579)

Utilizator fituicacopiator fituica Data 19 februarie 2009 14:44:48
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
# include <cstdio>
//# include <time.h>
# include <string.h>

using namespace std;

# define FIN "stramosi.in"
# define FOUT "stramosi.out"
# define min(a, b) (a < b ? a : b)
# define LMAX 3000005
# define Mod 666013
# define Nr 25

int T, i, j;
int Pow[Nr];
long long A, B;
int L[Mod + 5], C[Mod + 5];
char s[LMAX];

    void preprocesare()
    {
        int Bound = 20;
         
        Pow[0] = 1;
        for (i = 1; i <= Bound; ++i) Pow[i] = (Pow[i - 1] * 2);
        
        int c;
        for (i = 0; i < Bound; ++i)
          for (j = Pow[i], c = 1; j < Mod; j += Pow[i + 1], ++c)
          {
              L[j] = Bound - i;
              C[j] = c;
          }
    }
    
    int stramos(int st, int A, int B)
    {
        int mij, l1, l2, dr = min(L[A], L[B]), sol = 0;
        
        while (st <= dr)
        {
           mij = (st + dr) >> 1;
           l1 = Pow[L[A] - mij]; l2 = Pow[L[B] - mij];
           
           if ((C[A] + l1 - 1) == (C[B] + l2 - 1))
           {
               sol = mij;
               st = mij + 1;
           } else dr = mij - 1;
        }
        
        return sol;
    }

    int main()
    {
        //double t = clock();
        
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        preprocesare();
        
        /*scanf("%d",&T);
        
        scanf("%lld %lld",&A, &B);*/
        T = 1000000; A = 1; B = 666010;
        
        int rez, ct = -1;
        for (i = 1; i <= T; ++i)
        {
            rez = L[A] + L[B] - (stramos(1, A, B) << 1);
            
            if (rez > 9) s[++ct] = rez / 10;
            s[++ct] = rez % 10; s[++ct] = '\n';
            
            A = (A * (i + 1)) % Mod; B = (B * (i + 1)) % Mod;
            if (!A || !B) A = 123, B = 666011;
        }
        
        printf("%s",s);
        
        //printf("%lf",(clock() - t) / CLOCKS_PER_SEC);
        
        return 0;
    }