a53

plid_ANDRU

a53
Sep 17th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. #include <iostream>
  2. #define MOD 1000000007
  3. using namespace std;
  4.  
  5. int n, m, k;
  6. unsigned long long p2, sol, pk, c[10][10], pt, pl, pp;
  7. int mod(int a, int md)
  8. {
  9. return (a%md + md) % md;
  10. }
  11.  
  12. unsigned long long power(unsigned int x, unsigned long long y, int p) /// (x^y)%MOD
  13. {
  14. unsigned long long res = 1;
  15. x = x % p;
  16. while(y > 0)
  17. {
  18. if(y & 1)
  19. res =1ULL*(res*x) % p;
  20. y = y>>1;
  21. x = (1ULL*x*x) % p;
  22. }
  23. return res;
  24. }
  25.  
  26.  
  27. int main()
  28. {
  29. int i, j, t;
  30. cin>>n;
  31. for(i=1;i<=n;i++)
  32. {
  33. cin>>m>>k;
  34. if(m%2 && m>2) /// daca m este impar il fac m+1
  35. m++;
  36. if(k==1)
  37. cout<<1<<'\n';
  38. else if(m==1 || m==2)
  39. cout<<k<<'\n';
  40. else if(k==2)
  41. {
  42. p2=1ULL*power(2,(m-1), MOD); /// 2^m-1
  43. cout<<p2<<'\n';
  44. }
  45. else if(k==3)
  46. {
  47. p2=(power(3,m,MOD)+(3%MOD))%MOD; /// 3^m+3
  48. sol=mod(p2/4,MOD); /// (3^m+3)/4;
  49. cout<<sol<<'\n';
  50. }
  51. else if(k==4) /// se calculeza (4^m+4*2^m+6)/8
  52. {
  53. p2=8;
  54. pk=power(4,m,MOD);
  55. sol=pk;
  56. pk=power(2,m+2,MOD);
  57. sol=mod(sol+pk+6,MOD);
  58. sol=mod(sol/p2,MOD);
  59. cout<<sol<<'\n';
  60. }
  61. else if(k==5) /// se calculeza (5^m+5*3^m+10)/16
  62. {
  63. p2=16;
  64. pk=power(5,m,MOD);
  65. sol=pk;
  66. pk=power(3,m,MOD);
  67. pk=mod(pk*5,MOD);
  68. sol=mod(sol+pk+10,MOD);
  69. sol=mod(sol/p2,MOD);
  70. cout<<sol<<'\n';
  71. }
  72. else if(k==6) /// se calculeaza (6^m+6*4^m+15*2^m+20)/32
  73. {
  74. p2=32;
  75. pk=power(6,m,MOD);
  76. pt=power(4,m,MOD);
  77. pt=mod(pt*6,MOD);
  78. pl=power(2,m,MOD);
  79. pl=mod(pl*15,MOD);
  80. sol=mod(pk+pt+pl+20,MOD);
  81. sol=mod(sol/p2,MOD);
  82. cout<<sol<<'\n';
  83. }
  84. else if(k==7) /// se calculeaza (7^m+7*5^m+21*3^m+35)/64
  85. {
  86. p2=64;
  87. pk=power(7,m,MOD);
  88. pt=power(5,m,MOD);
  89. pt=mod(pt*7,MOD);
  90. pl=power(3,m,MOD);
  91. pl=mod(pl*21,MOD);
  92. sol=mod(pk+pt+pl+35,MOD);
  93. sol=mod(sol/p2,MOD);
  94. cout<<sol<<'\n';
  95. }
  96. else if(k==8) /// se calculeaza (8^m+8*6^m+28*4^m+56*2^m+70)/128
  97. {
  98. p2=128;
  99. pk=power(8,m,MOD);
  100. pt=power(6,m,MOD);
  101. pt=mod(pt*8,MOD);
  102. pl=power(4,m,MOD);
  103. pl=mod(pl*28,MOD);
  104. pp=power(2,m,MOD);
  105. pp=mod(pp*56,MOD);
  106. sol=mod(pk+pt+pl+pp+70, MOD);
  107. sol=mod(sol/p2,MOD);
  108. cout<<sol<<'\n';
  109. }
  110. else
  111. {
  112. p2=256;
  113. c[1][0]=1;
  114. c[1][1]=1;
  115. for(i=2; i<=9; i++) /// calcul combinari de k luate cate j
  116. {
  117. c[i][0]=1;
  118. c[i][i]=1;
  119. for(j=1; j<i; j++)
  120. c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
  121. }
  122. j=0;
  123. t=0;
  124. while(k-t>=0)
  125. {
  126. pk=1ULL*power((k-t),m,MOD);
  127. sol=1ULL*(sol+c[k][j]*pk)%MOD;
  128. j++;t+=2;
  129. }
  130. sol=mod(sol/p2,MOD);
  131. cout<<sol<<'\n';
  132. }
  133. }
  134. return 0;
  135. }
Add Comment
Please, Sign In to add comment