Advertisement
a53

fibosir_optimizat_si_cu_parsare

a53
Nov 29th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.63 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define Nmax 500
  5. #define Rmax 420000
  6. using namespace std;
  7.  
  8. class InParser
  9. {
  10. private:
  11. FILE *fin;
  12. char *buff;
  13. int sp;
  14.  
  15. char read_ch()
  16. {
  17. ++sp;
  18. if(sp==4096)
  19. {
  20. sp=0;
  21. fread(buff,1,4096,fin);
  22. }
  23. return buff[sp];
  24. }
  25.  
  26. public:
  27. InParser(const char* nume)
  28. {
  29. fin=fopen(nume,"r");
  30. buff=new char[4096]();
  31. sp=4095;
  32. }
  33.  
  34. InParser& operator >> (int &n)
  35. {
  36. char c;
  37. while(!isdigit(c=read_ch())&&c!='-');
  38. int sgn=1;
  39. if (c=='-')
  40. {
  41. n=0;
  42. sgn=-1;
  43. }
  44. else
  45. {
  46. n=c-'0';
  47. }
  48. while(isdigit(c=read_ch()))
  49. {
  50. n=10*n+c-'0';
  51. }
  52. n*=sgn;
  53. return *this;
  54. }
  55.  
  56. InParser& operator >> (long long &n)
  57. {
  58. char c;
  59. n=0;
  60. while(!isdigit(c=read_ch())&&c!='-');
  61. long long sgn=1;
  62. if(c=='-')
  63. {
  64. n=0;
  65. sgn=-1;
  66. }
  67. else
  68. {
  69. n=c-'0';
  70. }
  71. while(isdigit(c=read_ch()))
  72. {
  73. n=10*n+c-'0';
  74. }
  75. n*=sgn;
  76. return *this;
  77. }
  78. };
  79.  
  80. class OutParser
  81. {
  82. private:
  83. FILE *fout;
  84. char *buff;
  85. int sp;
  86.  
  87. void write_ch(char ch)
  88. {
  89. if(sp==50000)
  90. {
  91. fwrite(buff,1,50000,fout);
  92. sp=0;
  93. buff[sp++]=ch;
  94. }
  95. else
  96. {
  97. buff[sp++]=ch;
  98. }
  99. }
  100.  
  101. public:
  102. OutParser(const char* name)
  103. {
  104. fout=fopen(name,"w");
  105. buff=new char[50000]();
  106. sp=0;
  107. }
  108. ~OutParser()
  109. {
  110. fwrite(buff,1,sp,fout);
  111. fclose(fout);
  112. }
  113.  
  114. OutParser& operator <<(int vu32)
  115. {
  116. if(vu32<=9)
  117. {
  118. write_ch(vu32+'0');
  119. }
  120. else
  121. {
  122. (*this) <<(vu32/10);
  123. write_ch(vu32%10+'0');
  124. }
  125. return *this;
  126. }
  127.  
  128. OutParser& operator <<(long long vu64)
  129. {
  130. if(vu64<=9)
  131. {
  132. write_ch(vu64+'0');
  133. }
  134. else
  135. {
  136. (*this) <<(vu64/10);
  137. write_ch(vu64%10+'0');
  138. }
  139. return *this;
  140. }
  141.  
  142. OutParser& operator <<(char ch)
  143. {
  144. write_ch(ch);
  145. return *this;
  146. }
  147. OutParser& operator <<(const char *ch)
  148. {
  149. while(*ch)
  150. {
  151. write_ch(*ch);
  152. ++ch;
  153. }
  154. return *this;
  155. }
  156. };
  157.  
  158. int A[Nmax],B[Nmax],C[Nmax],Rez[Rmax],i,N,M,K;
  159.  
  160. int main()
  161. {
  162. InParser f("fibosir.in");
  163. OutParser g("fibosir.out");
  164. f>>N>>M>>K;
  165. A[0]=1;A[1]=1;B[0]=1;B[1]=1;Rez[0]=2;Rez[1]=1;Rez[2]=1;
  166. for(i=3;i<=N;++i)
  167. {
  168. int j=1,t=0;
  169. while(j<=A[0]||j<=B[0]||t>0)
  170. t=A[j]+B[j]+t,C[j]=t%10,t/=10,++j;
  171. C[0]=j-1;
  172. int MAX=max(B[0],C[0]);
  173. for(int i=1;i<=MAX;++i)
  174. {
  175. if(i<=B[0])
  176. A[i]=B[i];
  177. if(i<=C[0])
  178. B[i]=C[i];
  179. }
  180. A[0]=B[0],B[0]=C[0];
  181. reverse(C+1,C+C[0]+1);
  182. for(int t=1;t<=C[0];++t)
  183. Rez[Rez[0]+t]=C[t];
  184. Rez[0]+=C[0];
  185. }
  186. int j,Nr=0,tai=0,Max,poz;
  187. for(i=1;i<=Rez[0]&&Nr<=M;++i)
  188. {
  189. Max=Rez[i];
  190. for(j=1;j<=M-Nr;++j)
  191. if(Rez[i+j*K]>Max)
  192. Max=Rez[i+j*K],poz=i+j*K,tai=j;
  193. if(Max>Rez[i]&&Nr<M)
  194. i=poz,Nr+=tai;
  195. g<<Rez[i];
  196. } g<<'\n';
  197. return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement