Advertisement
Guest User

palid

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