Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- using namespace std;
- ifstream fin("fibosir.in");
- ofstream fout("fibosir.out");
- const int nmax=500000;
- short a[nmax],b[nmax],c[nmax],sir[nmax];
- int n,k,m,na,nb,nsir,nc;
- inline void Sum()
- {
- nc=max(na,nb);
- if(na<nb)
- for(int i=na+1; i<=nb; i++)
- a[i]=0;
- else for(int i=nb+1; i<=na; i++)
- b[i]=0;
- int t,cifra;
- t=0;
- for(int i=1; i<=nc; i++)
- {
- cifra=a[i]+b[i]+t;
- c[i]=cifra%10;
- t=cifra/10;
- }
- if(t)
- c[++nc]=t;
- }
- inline void Copy()
- {
- na=0;
- for(int i=1; i<=nb; i++)
- a[++na]=b[i];
- nb=0;
- for(int i=1; i<=nc; i++)
- b[++nb]=c[i];
- for(int i=nc; i>=1; i--)
- sir[++nsir]=c[i];
- }
- inline void Build()
- {
- na=nb=1;
- nsir=2;
- a[na]=b[nb]=1;
- sir[1]=sir[2]=1;
- for(int i=3; i<=n; i++)
- {
- Sum();
- Copy();
- }
- }
- inline void Solve()
- {
- int i=1;
- while(i<=nsir)
- {
- int mx=0,poz;
- bool ok=false;
- for(int j=1; j<=m && !ok; j++)
- {
- if(sir[i+j*k]>mx)
- {
- mx=sir[i+j*k];
- poz=j;///nr de subsecvente de lungime k eliminate
- if(mx==9)
- ok=true;///nu mai are rost sa merg mai departe
- }
- }
- if(sir[i]<mx)
- {
- i+=(poz*k);///->ma duc durect la pozitia unde am gasit maximul
- m-=poz;///elmine subsecvente de lungime k(in numar de poz)
- }
- else fout<<sir[i++];///afisez
- }
- /*for(int j=1;j<=top;j++)
- cout<<st[j]<<" ";
- cout<<"\n";
- */
- }
- int main()
- {
- fin>>n>>m>>k;
- Build();
- Solve();
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment