fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <cctype>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. struct huge {vector<char>num; huge();};
  8. huge::huge():num(102,0){}
  9.  
  10. inline huge hmax () {huge res;for(int i=0;i<102;++i) res.num[i]=9; return res;}
  11. inline bool comp (huge a, huge b) {return (a.num==b.num);}
  12. inline bool even (huge n) {return (n.num[101]%2==0);}
  13. inline bool zero (huge n)
  14. {for(int i=0;i<102;++i) if(n.num[i]!=0) return false; return true;}
  15.  
  16. inline string out(huge output);
  17.  
  18. inline bool grtr (huge a, huge b)
  19. {
  20. for(int i=0;i<102;++i)
  21. {
  22. if(a.num[i]>b.num[i]) return true;
  23. if(a.num[i]<b.num[i]) return false;
  24. }
  25. return false;
  26. }
  27.  
  28. inline huge decr(huge n)
  29. {
  30. for(int i=101;i>=0;--i)
  31. if(n.num[i]>0) {--n.num[i]; return n;}
  32. else n.num[i]=9;
  33. return n;
  34. }
  35.  
  36. inline huge incr(huge n)
  37. {
  38. for(int i=101;i>=0;--i)
  39. if(n.num[i]<9) {++n.num[i]; return n;}
  40. else n.num[i]=0;
  41. return n;
  42. }
  43.  
  44. inline huge div2(huge n)
  45. {
  46. for(int i=101;i>=0;--i)
  47. if(n.num[i]%2==0) n.num[i]/=2;
  48. else
  49. {
  50. n.num[i]/=2; n.num[i+1]+=5;
  51. if(n.num[i+1]>=10) {n.num[i+1]-=10; n.num[i]+=1;}
  52. }
  53. return n;
  54. }
  55.  
  56. inline huge addc (huge a, huge b)
  57. {
  58. for(int i=101;i>=0;i--)
  59. {a.num[i]+=b.num[i]; if(a.num[i]>=10) {a.num[i]-=10; a.num[i-1]+=1;}}
  60. return a;
  61. }
  62.  
  63. inline huge mult (huge a, huge b)
  64. {
  65. huge res;
  66. for(int i=101;i>=0;--i) if(a.num[i]!=0)
  67. for(int j=101;j>=0;--j) if(b.num[j]!=0)
  68. {
  69. huge hlp;
  70. if(i+j-101<0) return (hmax());
  71. hlp.num[i+j-101]=(a.num[i]*b.num[j])%10;
  72. if((a.num[i]*b.num[j])/10!=0)
  73. if(i+j-102<0) return (hmax());
  74. else hlp.num[i+j-102]=(a.num[i]*b.num[j])/10;
  75. res=addc(res,hlp);
  76. }
  77. return res;
  78. }
  79.  
  80. inline huge itoh(int n)
  81. {huge res; for(int i=0;n>0;++i) {res.num[101-i]=n%10; n/=10;} return res;}
  82.  
  83. inline huge pow(huge k, huge n)
  84. {
  85. if(zero(n)) return itoh(1);
  86. if(!even(n))
  87. {return mult(k,pow(k,decr(n)));}
  88. huge hlp=pow(k,div2(n)); return mult(hlp,hlp);
  89. }
  90.  
  91. inline huge mean (huge a, huge b)
  92. {huge res=addc(a,b); if(!even(res)) res=decr(res); res=div2(res); return res;}
  93.  
  94. inline huge stoh(string input)
  95. {
  96. huge res;
  97. for(int i=input.size()-1;i>=0;--i)
  98. res.num[102-input.size()+i]=int(input[i]-'0');
  99. return res;
  100. }
  101.  
  102. inline huge read(void)
  103. {
  104. string res;
  105. while(!isdigit(cin.peek())) cin.ignore();
  106. char hlp=cin.get(); while(isdigit(hlp)) {res+=hlp; hlp=cin.get();}
  107. return stoh(res);
  108. }
  109.  
  110. inline string out(huge output)
  111. {
  112. int i=0; while(output.num[i]==0) ++i;
  113. string res; for(;i<102;++i) res+=char('0'+output.num[i]);
  114. return res;
  115. }
  116.  
  117. huge wysz (huge n, huge p)
  118. {
  119. huge a=itoh(1); huge b=incr(p);
  120. huge res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
  121. huge hlp; hlp=pow(res,n);
  122. while(!comp(hlp,p))
  123. {
  124. if(grtr(hlp,p)) b=res;
  125. else a=res;
  126. res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
  127. hlp=pow(res,n);
  128. }
  129. return res;
  130. }
  131.  
  132. int main()
  133. {
  134. ios_base::sync_with_stdio(false);
  135. int n; while(cin >> n) cout << out(wysz(itoh(n),read())) << '\n';
  136. return 0;
  137. }
Runtime error #stdin #stdout #stderr 0.02s 4080KB
stdin
7
4357186184021382204544
stdout
Standard output is empty
stderr
1	2178593092010691102273	4357186184021382204545
1	1089296546005345551137	2178593092010691102273
1	544648273002672775569	1089296546005345551137
1	272324136501336387785	544648273002672775569
1	136162068250668193893	272324136501336387785
1	68081034125334096947	136162068250668193893
*** glibc detected *** ./prog: double free or corruption (out): 0x081ca858 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6e3f1)[0xb76213f1]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6fc58)[0xb7622c58]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb7625d0d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb77a14bf]
======= Memory map: ========
08048000-0804f000 r-xp 00000000 09:03 141662     /home/wH4V8u/prog
0804f000-08050000 rw-p 00006000 09:03 141662     /home/wH4V8u/prog
081ac000-081cf000 rw-p 00000000 00:00 0          [heap]
b7400000-b7421000 rw-p 00000000 00:00 0 
b7421000-b7500000 ---p 00000000 00:00 0 
b75b1000-b75b3000 rw-p 00000000 00:00 0 
b75b3000-b7709000 r-xp 00000000 09:03 959021     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b7709000-b770a000 ---p 00156000 09:03 959021     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b770a000-b770c000 r--p 00156000 09:03 959021     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b770c000-b770d000 rw-p 00158000 09:03 959021     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b770d000-b7710000 rw-p 00000000 00:00 0 
b7710000-b772c000 r-xp 00000000 09:03 92165      /lib/i386-linux-gnu/libgcc_s.so.1
b772c000-b772d000 rw-p 0001b000 09:03 92165      /lib/i386-linux-gnu/libgcc_s.so.1
b772d000-b772e000 rw-p 00000000 00:00 0 
b772e000-b7752000 r-xp 00000000 09:03 959049     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7752000-b7753000 r--p 00023000 09:03 959049     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7753000-b7754000 rw-p 00024000 09:03 959049     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7754000-b7834000 r-xp 00000000 09:03 1581566    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7834000-b7838000 r--p 000e0000 09:03 1581566    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7838000-b7839000 rw-p 000e4000 09:03 1581566    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7839000-b7840000 rw-p 00000000 00:00 0 
b7844000-b7846000 rw-p 00000000 00:00 0 
b7846000-b7847000 r-xp 00000000 00:00 0          [vdso]
b7847000-b7863000 r-xp 00000000 09:03 92142      /lib/i386-linux-gnu/ld-2.13.so
b7863000-b7864000 r--p 0001b000 09:03 92142      /lib/i386-linux-gnu/ld-2.13.so
b7864000-b7865000 rw-p 0001c000 09:03 92142      /lib/i386-linux-gnu/ld-2.13.so
bfe70000-bfe91000 rw-p 00000000 00:00 0          [stack]