Advertisement
Guest User

Untitled

a guest
May 25th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<math.h>
  5. using namespace std;
  6. #define int long long
  7.  
  8.  
  9. int p;
  10.  
  11. int potega(int a, int k, int q){
  12. if (k==0)
  13. return 1;
  14. if (k%2==0){
  15. int w=potega(a,k/2,q);
  16. return (w*w)%q;
  17. }
  18. int w=potega(a,k-1,q);
  19. return (a*w)%q;
  20.  
  21. }
  22.  
  23. vector<int> eval(vector<int>A, int x){
  24. vector<int> wynik;
  25. if(A.size()==1){
  26. wynik.push_back(A[0]);
  27. return wynik;
  28. }
  29. vector<int> A0;
  30. vector<int> A1;
  31. for(int i=0; i<A.size(); i++){
  32. if(i%2==0){
  33. A0.push_back(A[i]);
  34. }else{
  35. A1.push_back(A[i]);
  36. }
  37. }
  38. vector<int> A0_wynik=eval(A0,(x*x)%p);
  39. vector<int> A1_wynik=eval(A1,(x*x)%p);
  40.  
  41. int om=1;
  42. for(int i=0; i<A.size()/2; i++){
  43. int temp=(A0_wynik[i]+(om*A1_wynik[i])%p)%p;
  44. wynik.push_back(temp%p);
  45. if(i>0){
  46. om*=x;
  47. om%=p;
  48. }
  49. else
  50. om=x;
  51. }
  52. om=1;
  53. for(int i=0; i<A.size()/2; i++){
  54. int temp=(A0_wynik[i]-(om*A1_wynik[i])%p+p)%p;
  55. wynik.push_back(temp%p);
  56. if(i>0){
  57. om*=x;
  58. om%=p;
  59. }
  60. else
  61. om=x;
  62. }
  63. return wynik;
  64.  
  65. }
  66.  
  67. #undef int
  68. int main(){
  69. #define int long long
  70.  
  71. p=1;
  72. for(int i=0; i<27; i++)
  73. p*=2;
  74. p*=15;
  75. p+=1;
  76.  
  77. int z;
  78. cin>>z;
  79. while(z--){
  80. string a,b;
  81. cin>>a>>b;
  82. vector<int>A;
  83. vector<int>B;
  84.  
  85.  
  86. int znak=1;
  87.  
  88. int poczatek=0;
  89. if(a[0]=='-'){
  90. poczatek++;
  91. znak*=-1;
  92. }
  93. for(int i=a.length()-1; i>=poczatek; i--){
  94. A.push_back(a[i]-'0');
  95. }
  96.  
  97. poczatek=0;
  98. if(b[0]=='-'){
  99. poczatek++;
  100. znak*=-1;
  101. }
  102. for(int i=b.length()-1; i>=poczatek; i--){
  103. B.push_back(b[i]-'0');
  104. }
  105.  
  106.  
  107. int n=1;
  108. int ilecyfr=max(2*A.size(),2*B.size());
  109. while(n<ilecyfr)
  110. n*=2;
  111.  
  112.  
  113. for(int i=A.size(); i<n; i++){
  114. A.push_back(0);
  115. }
  116. for(int i=B.size(); i<n; i++){
  117. B.push_back(0);
  118. }
  119.  
  120.  
  121. int temp=1;
  122. for(int i=0; i<27; i++)
  123. temp*=2;
  124. temp/=n;
  125. int omega=440564289;
  126. omega=potega(omega,temp,p);
  127.  
  128.  
  129.  
  130. vector<int> wartA=eval(A, omega);
  131. vector<int> wartB=eval(B,omega);
  132.  
  133.  
  134.  
  135. for(int i=0; i<n; i++){
  136. wartA[i]=(wartA[i]*wartB[i])%p;
  137. }
  138.  
  139. vector<int>wynik=eval(wartA,1 * potega(omega, p-2, p));
  140.  
  141.  
  142. temp=wynik.size();
  143. temp=potega(n,p-2,p);
  144.  
  145. for(int i=0; i<wynik.size(); i++){
  146. wynik[i]*=temp;
  147. wynik[i]%=p;
  148. }
  149. for(int i=0; i<wynik.size()-1; i++){
  150. int x=wynik[i];
  151. wynik[i]%=10;
  152. wynik[i+1]+=x/10;
  153. }
  154.  
  155. if(znak==-1)
  156. cout<<'-';
  157.  
  158. bool omijajzera=true;
  159. for(int i=wynik.size()-1; i>=0; i--){
  160. if(omijajzera && wynik[i]==0)
  161. continue;
  162. else
  163. omijajzera=false;
  164. cout<<wynik[i];
  165. }
  166. cout<<endl;
  167.  
  168. }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement