Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // blabla.cpp : Defines the entry point for the console application.
- //
- #include <cstdlib>
- #include <cstdio>
- #include <intrin.h>
- #include <vector>
- #include <ctime>
- using namespace std;
- const unsigned long long maxx=100000*(unsigned long long)100000*(unsigned long long)100000*(unsigned long long)1000;
- vector< vector< char > >tabela;
- int rekord;
- class Cduza_liczba{
- public:
- vector <unsigned int> dane;
- int size;
- static const unsigned long long baza=100000*10000;
- static const int bcyfr=9;
- long long cyfr;
- int dodaj_zaokraglenie;
- int glowa;
- bool strata_cyfr;
- Cduza_liczba(int s,int d, unsigned int init)
- {
- size=s;
- dodaj_zaokraglenie=d;
- glowa=size-1;
- dane=vector<unsigned int> (size,0);
- dane[0]=init;
- //baza=b;
- strata_cyfr=false;
- cyfr=0;
- };
- void mnoz (unsigned long long c)//dla 32bit zamienic na u.int
- {
- unsigned long long akumulator=0;
- int i=(glowa+1)%size;
- if (strata_cyfr)
- {
- akumulator=c*dodaj_zaokraglenie;
- strata_cyfr=false;
- }else {akumulator=0;};
- do
- {
- akumulator+=dane[i]*(unsigned long long)c;
- dane[i]=akumulator%baza;
- akumulator/=baza;
- i=(i+1)%size;
- }while (i!=(glowa+1)%size);
- if (akumulator>0)
- {
- glowa=(glowa+1)%size;
- cyfr+=bcyfr;
- if (dane[glowa]>0) strata_cyfr=true;
- dane[glowa]=akumulator;
- }
- };
- unsigned long long przod()
- {
- unsigned long long p;
- int a;
- p=dane[(glowa-1+size)%size]*baza + dane[(glowa-2+size)%size];
- a=dane[glowa];
- p=p*10;
- while (a>0)
- {
- p=p/10+(a%10)*baza*baza;
- a=a/10;
- }
- return p;
- }
- void wypisz()
- {
- for (int j=0;j<size;j++)
- {
- printf("%09u ", dane[(glowa+size-j)%size]);
- }
- printf(" %llu g:%d c:%d d:%d s:%d",przod(),glowa, cyfr,dodaj_zaokraglenie,strata_cyfr?1:0);
- }
- };
- bool test(unsigned long long x)
- {
- unsigned long long dzielnik=100000000000000000; // 10^17;
- int indeks=0;
- if (x/dzielnik!=52 ) return false;
- //printf("52");
- dzielnik/=10;
- for (int j=0;j<=16;j++)
- {
- int cyfra = (x/dzielnik)%10;
- //printf("%d",cyfra);
- if (cyfra == tabela[j][indeks])
- {
- }else
- if(cyfra == tabela[j][indeks+(1<<j)])
- {
- indeks=indeks+(1<<j);
- }else return false;
- dzielnik=dzielnik/10;
- if (j>rekord) rekord=j;
- }
- return true;
- printf("huuuuuuraaaaaaa");
- }
- int main()
- {
- rekord=0;
- printf("halo\n");
- long long a,b,c,d, p, dzielnik;
- a=1;
- while (a<maxx) a*=5;
- a=a%maxx;
- p=a;
- dzielnik=10;
- for (int j=1;j<50000000;j++)
- {
- a=(a*5)%maxx;
- while (a%dzielnik == p%dzielnik)
- {
- printf("%lld %d\n",dzielnik, j);
- dzielnik=dzielnik*10;
- }
- if (dzielnik>=maxx) break;
- }
- tabela.push_back( vector<char>(2) );
- tabela[0][0]=1;tabela[0][1]=6;
- for (int j=1; j<=16;j++)
- {
- tabela.push_back( vector<char>(2<<j) ) ;
- tabela[j][0]=tabela[j-1][(1<<j)-1]/2;
- for ( int i=1;i<(2<<j);i++ )
- {
- tabela[j][i]=tabela[j-1][(i-1)%(1<<j)]/2+ 5*(tabela[j][i-1]%2);
- }
- }
- for (int j=0;j<100;j++){
- printf("***%lld %lld\n",tabela[16][j],tabela[16][(1<<16)+j]);
- };
- //wyrzucamy pierwszą liczbę
- //unsigned long long p=0;
- p=0;
- for (int j=16;j>=0;j--)
- {
- p=p*10+tabela[j][0];
- };
- p=(p*10+2)%maxx;
- p=(p*10+5)%maxx;
- printf("++++++++%llu\n",p);
- a=p;
- for (int i=1;i<(2<<18);i++)
- {
- a=(a*5)%maxx;
- p=0;
- for (int j=16;j>=0;j--)
- {
- p=p*10+tabela[j][i%(2<<j)];
- };
- p=(p*10+2)%maxx;
- p=(p*10+5)%maxx;
- if (a!=p)printf("dupa");//else printf("ok");
- //printf("\n++%llu %llu\n",p,a);
- }
- int kk=3;
- for (int j=0; j<(2<<kk)+2;j++)
- {
- //printf("52");
- for ( int i=kk-1;i>=0;i-- )
- {
- printf("%d",tabela[i][j%(2<<i)]);
- }
- printf("25\n");
- }
- vector<int> offsety(1000);
- for (int i=0;i<1000;i++)
- {
- a=i*1000000;
- b=i*1000000+1;
- int ile;
- for (ile=1; ile<29; )
- {
- a=a*2;
- b=b*2;
- if (a>=1000000000) a=a/10;
- if (b>=1000000000) b=b/10+1;
- if ( (a>=b)|| (!( (a>527000000)||(b<521000000) ) ) ) break;
- ile++;
- }
- offsety[i]=ile; // 2^ile
- if (ile<31)printf("%03d %02d %lld %lld %lld %lld\n",i, ile, ((long long)i)<<ile, ((long long)i+1)<<ile ,a,b);
- }
- a=1;
- while (a<maxx) a*=2;
- a=a%maxx;
- b=a;
- for (int j=1;j<10;j++)
- {
- a=(a*2);
- b=b*2;
- if (a>=maxx) a=a/10;
- if (b>=maxx) b=b/10+1;
- if ((a>=52100000000000000)&&(a<=52700000000000000)&&j>(1000000000-100000))
- printf("%lld %d %lld ",a, j , b-a);
- }
- Cduza_liczba A(4,0, 1);
- Cduza_liczba B(4,1, 1);
- printf("\n");
- A.wypisz();
- printf("\n");
- B.wypisz();
- printf("\n");
- clock_t start, finish;
- start = clock();
- //for (int j=0;j<100000000;j++)
- //{
- // A.mnoz(1<<29);
- // B.mnoz(1<<29);
- // if (j%1000000==0)printf("%d ",j/1000000);
- //}
- printf("\n");
- finish = clock();
- printf("%lfs\n", (finish - start)/(double)CLOCKS_PER_SEC );
- for (int j=0;j<5;j++)
- {
- A.mnoz(1<<29);
- B.mnoz(1<<29);
- A.wypisz();
- printf("\n");
- B.wypisz();
- printf("\n");
- printf("\n");
- }
- //--------------------wlsciwa zabawa------------------
- Cduza_liczba liczbaA(6,0, 1);
- Cduza_liczba liczbaB(6,1, 1);
- unsigned long long skrA, skrB;
- printf("\n");
- liczbaA.wypisz();
- printf("\n");
- liczbaB.wypisz();
- printf("\n");
- unsigned long long licznik=0,kolejnycel=0;
- while (liczbaA.cyfr==0)
- {
- licznik+=29;
- liczbaA.mnoz(1<<29); //najszybciej jak to mozliwe wychpdzimy poza zakres gdy trzymamy zera wiodące
- liczbaB.mnoz(1<<29);
- }
- if (test(5265158745164752236)) printf("przeszedl\n"); else printf("nie przeszedfl\n");
- rekord=-1;
- int oldrekord=-1;
- vector <unsigned long long> wyniki;
- for (/*int ii=0;ii<20;ii++*/;;){
- skrA=liczbaA.przod();
- skrB=liczbaB.przod();
- if (skrA!=skrB) { printf("za mala dokladnosc\n");break; }
- if (test( skrA ))
- {
- printf("hura");
- wyniki.push_back(licznik);
- }
- if (rekord>oldrekord)
- {
- printf("rekord %d %llu\n",rekord+3,licznik);
- oldrekord=rekord;
- }
- //printf("%lld\n",skrA/10000000000000000);
- int skok=offsety[ skrA/10000000000000000];
- //printf("s%d\n",skok);
- liczbaA.mnoz(1<<skok);
- liczbaB.mnoz(1<<skok);//1<<skok
- licznik+=skok;
- //printf("%u \n",rekord);
- if (licznik >kolejnycel)
- {// informuje o przebiegu prac. wykomentowac, jesli tylko szukamy rekordow.
- printf("%llu %u %u \n",licznik/1000000,wyniki.size(),rekord);
- kolejnycel+=100000000;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement