Guest User

Untitled

a guest
Dec 11th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5.  
  6. using namespace std;
  7. int a,x;
  8. int bla[4]={1,2,4,16};
  9. long long pow[2][20];
  10.  
  11. long long pot(int a,long long x,long long mod){
  12.     if(x==0) return 1;
  13.     long long ret=pot(a,x/2,mod);
  14.     ret=ret*ret%mod;
  15.     if(x%2==1) ret=ret*a%mod;
  16.     return ret;
  17. }
  18.  
  19. long long calc(int v,int a,int x,bool k,int n){
  20.     if(v>=n) return 0;
  21.     if(x==0 || a==1) return pow[k][v];
  22.     if(a>2 && x>1) return 0;
  23.     if(a==2 && x>3) return 0;
  24.     if(x==1){
  25.         if(n<=a*v) return 0;
  26.         else return pow[k][a*v];
  27.     }
  28.     if(bla[x]*v>=n) return 0;
  29.     else return pow[k][bla[x]*v];
  30. }
  31.  
  32. int A,v;long long MOD;
  33. int Na[2];
  34. long long solve(int a,int x,int n[2],int mod){
  35.     if(x==0) return 1;
  36.     //if(x==1)printf("%d %d\n",n[0],n[1]);
  37.     //printf("bla\n");
  38.     long long r[2];
  39.     for(int k=0;k<2;++k){
  40.         r[k]=0;
  41.         if(n[k]==0) continue;
  42.         A=a;
  43.         v=0;
  44.         while(A>0 && A%pow[k][1]==0){
  45.             A/=pow[k][1];
  46.             ++v;
  47.         }
  48.         //if(x==1)printf("%d %d\n",n[0],n[1]);
  49.    
  50.         if(n[1]==0){
  51.             Na[0]=n[0]-1;
  52.             Na[1]=0;
  53.             MOD=mod/2;
  54.         }
  55.         //if(x==1)printf("%d %d\n",n[0],n[1]); ova linija ovdje
  56.    
  57.         else{
  58.             Na[0]=n[0]+1;
  59.             Na[1]=n[1]-1;
  60.             MOD=mod*2/5;
  61.         }
  62.        
  63.         r[k]=pot(A,solve(a,x-1,Na,MOD),pow[k][n[k]]);
  64.         if(a%pow[k][1]==0) r[k]=r[k]*calc(v,a,x-1,k,n[k])%pow[k][n[k]];
  65.     //if(x==1)printf("%d %d\n",n[0],n[1]);
  66.    
  67.     }
  68.     //if(x==2) printf("%lld %lld\n",r[1],r[0]);
  69.    
  70.     //if(x==1)printf("%d %d\n",n[0],n[1]);
  71.     long long ret=0;
  72.     if(n[0]!=0) ret+=pow[1][n[1]]*r[0]%mod*pot(pow[1][n[1]],pow[0][n[0]-1]-1,pow[0][n[0]])%mod;
  73.     if(n[1]!=0) ret+=pow[0][n[0]]*r[1]%mod*pot(pow[0][n[0]],4*pow[1][n[1]-1]-1,pow[1][n[1]])%mod;
  74.     //printf("x:%d ret:%lld n %d %d mod:%d\n",x,ret%mod,n[0],n[1],mod);
  75.     return ret%mod;
  76. }
  77. int t,p,q;
  78. int w[2];
  79. int main(void){
  80.     w[1]=9;
  81.     w[0]=9;
  82.     pow[0][0]=1;
  83.     pow[1][0]=1;
  84.     for(int i=1;i<20;++i){
  85.         pow[0][i]=pow[0][i-1]*2;
  86.         pow[1][i]=pow[1][i-1]*5;
  87.     }
  88.     scanf("%d",&t);
  89.     for(int i=0;i<t;++i){
  90.         scanf("%d%d",&p,&q);
  91.         printf("%d\n",solve(p,q,w,1000000000));
  92.     }
  93.     scanf("%%");
  94. return 0;
  95. }
Add Comment
Please, Sign In to add comment