Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <algorithm>
- #include <cstring>
- #define Nmax 500
- #define Rmax 420000
- using namespace std;
- class InParser
- {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch()
- {
- ++sp;
- if(sp==4096)
- {
- sp=0;
- fread(buff,1,4096,fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume)
- {
- fin=fopen(nume,"r");
- buff=new char[4096]();
- sp=4095;
- }
- InParser& operator >> (int &n)
- {
- char c;
- while(!isdigit(c=read_ch())&&c!='-');
- int sgn=1;
- if (c=='-')
- {
- n=0;
- sgn=-1;
- }
- else
- {
- n=c-'0';
- }
- while(isdigit(c=read_ch()))
- {
- n=10*n+c-'0';
- }
- n*=sgn;
- return *this;
- }
- InParser& operator >> (long long &n)
- {
- char c;
- n=0;
- while(!isdigit(c=read_ch())&&c!='-');
- long long sgn=1;
- if(c=='-')
- {
- n=0;
- sgn=-1;
- }
- else
- {
- n=c-'0';
- }
- while(isdigit(c=read_ch()))
- {
- n=10*n+c-'0';
- }
- n*=sgn;
- return *this;
- }
- };
- class OutParser
- {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch)
- {
- if(sp==50000)
- {
- fwrite(buff,1,50000,fout);
- sp=0;
- buff[sp++]=ch;
- }
- else
- {
- buff[sp++]=ch;
- }
- }
- public:
- OutParser(const char* name)
- {
- fout=fopen(name,"w");
- buff=new char[50000]();
- sp=0;
- }
- ~OutParser()
- {
- fwrite(buff,1,sp,fout);
- fclose(fout);
- }
- OutParser& operator <<(int vu32)
- {
- if(vu32<=9)
- {
- write_ch(vu32+'0');
- }
- else
- {
- (*this) <<(vu32/10);
- write_ch(vu32%10+'0');
- }
- return *this;
- }
- OutParser& operator <<(long long vu64)
- {
- if(vu64<=9)
- {
- write_ch(vu64+'0');
- }
- else
- {
- (*this) <<(vu64/10);
- write_ch(vu64%10+'0');
- }
- return *this;
- }
- OutParser& operator <<(char ch)
- {
- write_ch(ch);
- return *this;
- }
- OutParser& operator <<(const char *ch)
- {
- while(*ch)
- {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- int A[Nmax],B[Nmax],C[Nmax],Rez[Rmax],i,N,M,K;
- int main()
- {
- InParser f("fibosir.in");
- OutParser g("fibosir.out");
- f>>N>>M>>K;
- A[0]=1;A[1]=1;B[0]=1;B[1]=1;Rez[0]=2;Rez[1]=1;Rez[2]=1;
- for(i=3;i<=N;++i)
- {
- int j=1,t=0;
- while(j<=A[0]||j<=B[0]||t>0)
- t=A[j]+B[j]+t,C[j]=t%10,t/=10,++j;
- C[0]=j-1;
- int MAX=max(B[0],C[0]);
- for(int i=1;i<=MAX;++i)
- {
- if(i<=B[0])
- A[i]=B[i];
- if(i<=C[0])
- B[i]=C[i];
- }
- A[0]=B[0],B[0]=C[0];
- reverse(C+1,C+C[0]+1);
- for(int t=1;t<=C[0];++t)
- Rez[Rez[0]+t]=C[t];
- Rez[0]+=C[0];
- }
- int j,Nr=0,tai=0,Max,poz;
- for(i=1;i<=Rez[0]&&Nr<=M;++i)
- {
- Max=Rez[i];
- for(j=1;j<=M-Nr;++j)
- if(Rez[i+j*K]>Max)
- Max=Rez[i+j*K],poz=i+j*K,tai=j;
- if(Max>Rez[i]&&Nr<M)
- i=poz,Nr+=tai;
- g<<Rez[i];
- } g<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement