Advertisement
a53

palid

a53
Jul 27th, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. #include <iostream>
  2. #define NMax 1000
  3. #define Kmax 10
  4. #define MOD 1000000007
  5. #define BAZA 10000
  6. using namespace std;
  7. int c[2][Kmax];
  8. typedef int Huge[NMax+3];
  9.  
  10. int PUTERE(int a,int b)
  11. {
  12. if(b==0)
  13. return 1;
  14. else
  15. if(b%2==0)
  16. return PUTERE((a*a)%MOD,b/2);
  17. else
  18. return a*PUTERE((a*a)%MOD,b/2)%MOD;
  19. }
  20.  
  21. void Atrib0(Huge H) /// H <- 0
  22. {
  23. H[0]=0;
  24. }
  25.  
  26. void AtribValue(Huge H,unsigned long X) /// H <- X
  27. {
  28. H[0]=0;
  29. while(X)
  30. ++H[0],H[H[0]]=X%BAZA,X/=BAZA;
  31. }
  32.  
  33. void Add(Huge A,Huge B) /// A <- A+B
  34. {
  35. int i,T=0;
  36. if(B[0]>A[0])
  37. {
  38. for(i=A[0]+1;i<=B[0];)
  39. A[i++]=0;
  40. A[0]=B[0];
  41. }
  42. else
  43. for(i=B[0]+1;i<=A[0];)
  44. B[i++]=0;
  45. for(i=1;i<=A[0];++i)
  46. A[i]+=B[i]+T,T=A[i]/BAZA,A[i]%=BAZA;
  47. if(T)
  48. A[++A[0]]=T;
  49. }
  50.  
  51. void Subtract(Huge A,Huge B) /// A <- A-B
  52. {
  53. int i,T=0;
  54. for(i=B[0]+1;i<=A[0];)
  55. B[i++]=0;
  56. for(i=1;i<=A[0];++i)
  57. A[i]+=(T=(A[i]-=B[i]+T)<0)?BAZA:0;
  58. /* Adica A[i]=A[i]-(B[i]+T);
  59. if (A[i]<0) T=1; else T=0;
  60. if (T) A[i]+=BAZA; */
  61. while(!A[A[0]])
  62. A[0]--;
  63. }
  64.  
  65. void Mult(Huge H,unsigned long X) /// H <- H*X
  66. {
  67. int i;
  68. unsigned long T=0;
  69. for(i=1;i<=H[0];++i)
  70. H[i]=H[i]*X+T,T=H[i]/BAZA,H[i]=H[i]%BAZA;
  71. while(T) /// Cat timp exista transport
  72. H[++H[0]]=T%BAZA,T/=BAZA;
  73. }
  74.  
  75. void MultHuge(Huge A,Huge B) /// A <- A x B
  76. {
  77. int i,j,T=0;
  78. Huge C;
  79. C[0]=A[0]+B[0]-1;
  80. for(i=1;i<=A[0]+B[0];)
  81. C[i++]=0;
  82. for(i=1;i<=A[0];++i)
  83. for(j=1;j<=B[0];++j)
  84. C[i+j-1]+=A[i]*B[j];
  85. for(i=1;i<=C[0];++i)
  86. T=(C[i]+=T)/BAZA,C[i]%=BAZA;
  87. if(T)
  88. C[++C[0]]=T;
  89. for(int i=0;i<=C[0];++i)
  90. A[i]=C[i];
  91. }
  92.  
  93. unsigned long Divide(Huge A, unsigned long X) /// A <- A/X si intoarce A%X
  94. {
  95. int i;
  96. unsigned long R=0;
  97. for(i=A[0];i;--i)
  98. A[i]=(R=BAZA*R+A[i])/X,R%=X;
  99. while(!A[A[0]] && A[0]>1)
  100. A[0]--;
  101. return R;
  102. }
  103.  
  104. unsigned long Mod(Huge A,unsigned long X) /// Intoarce A%X (restul)
  105. {
  106. int i;
  107. unsigned long R=0;
  108. for(i=A[0];i;--i)
  109. R=(BAZA*R+A[i])%X;
  110. return R;
  111. }
  112.  
  113. void Afisare(Huge H)
  114. {
  115.  
  116. for(int i=H[0];i>0;--i)
  117. cout<<H[i];
  118. cout<<'\n';
  119. }
  120.  
  121. void pdcomb(int n) /// folosesc doar doua linii (0 si 1)
  122. {
  123. for(int i=0;i<=Kmax;++i)
  124. c[0][i]=c[1][i]=0;
  125. c[0][0]=c[1][0]=1; /// coloana 0
  126. for(int i=1;i<=n;++i)
  127. {
  128. for(int j=1;j<=i;++j)
  129. c[1][j]=(c[0][j]+c[0][j-1]);
  130. for(int k=0;k<=i;++k)
  131. c[0][k]=c[1][k];
  132. }
  133. }
  134.  
  135. void P(Huge A,int n) /// A <- A^n logaritmic
  136. {
  137. Huge P;P[0]=1,P[1]=1;
  138. if(n==0)
  139. A[0]=1,A[1]=1;
  140. else
  141. while(n>0)
  142. {
  143. if(n%2==1)
  144. MultHuge(P,A);
  145. n/=2;
  146. MultHuge(A,A);
  147. }
  148. for(int i=0;i<=P[0];++i)
  149. A[i]=P[i];
  150. }
  151.  
  152. int main()
  153. {
  154. int n,m,k;
  155. Huge SOL,A;
  156. cin>>n;
  157. pdcomb(n);
  158. while(n--)
  159. {
  160. cin>>m>>k;
  161. if(m%2)
  162. ++m;
  163. if(k==1)
  164. cout<<1<<'\n';
  165. else
  166. if(k==2)
  167. cout<<PUTERE(2,m-1)%MOD<<'\n';
  168. else
  169. {
  170. Atrib0(SOL);
  171. pdcomb(k);
  172. for(int i=0;k>=2*i;++i)
  173. {
  174. AtribValue(A,k-2*i);
  175. P(A,m);
  176. Mult(A,c[1][i]);
  177. Add(SOL,A);
  178. }
  179. Divide(SOL,PUTERE(2,k-1));
  180. cout<<Mod(SOL,MOD)<<'\n';
  181. }
  182. }
  183. return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement