abinash_hstu

NCPC 2016 D

Feb 20th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. //OM
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <vector>
  9. #include <string>
  10. #include <map>
  11. #include <set>
  12. #include <list>
  13. #include <stack>
  14. #include <queue>
  15. #include <utility>
  16. #include <sstream>
  17. #include <algorithm>
  18. using  namespace  std;
  19.  
  20. #define  x first
  21. #define  y second
  22. #define  pb push_back
  23. #define  mp make_pair
  24. #define  PI (acos(-1.0))
  25. #define  mem(a,b) memset(a,b,sizeof(a))
  26. #define  Sort(x) sort(x.begin(),x.end())
  27. #define  FOR(i, b, e) for(int i = b; i <= (int)(e); i++)
  28. #define  FORR(i, b, e) for(int i = b; i >=(int)(e); i--)
  29. #define  FORI(i, s) for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)
  30. #define  pr(x) cout<<x<<"\n"
  31. #define  prs(x) cout<<x<<" "
  32. #define  pr2(x,y) cout<<x<<" "<<y<<"\n"
  33. #define  pr3(x,y,z) cout<<x<<" "<<y<<" "<<z<<"\n"
  34. #define  ppr(a) cout<<a.x<<" "<<a.y<<"\n"
  35.  
  36. typedef  long long ll;
  37. typedef  pair <int, int> pii;
  38. typedef  pair <double , double> pdd;
  39. typedef  vector <int> vi;
  40. typedef  vector <pii> vpii;
  41.  
  42. //int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction
  43. //int dx[]={1,1,0,-1,-1,-1,0,1};
  44. //int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction
  45.  
  46. #define  EPS 1e-9
  47. #define  MAX 100007
  48.  
  49.  
  50.  
  51.  
  52. ll  mul(ll  a, ll  b, ll  mod) {
  53.     ll  ans = 0;
  54.     while (b) {
  55.         if (b & 1)
  56.             ans = (ans + a) % mod;
  57.         a = (a + a) % mod;
  58.         b >>= 1;
  59.     }
  60.     return ans;
  61. }
  62. ll  binByMod(ll  a, ll  to, ll  mod) {
  63.     ll  ans = 1;
  64.     while (to) {
  65.         if (to & 1)
  66.             ans = mul(ans, a, mod);
  67.         a = mul(a, a, mod);
  68.         to >>= 1;
  69.     }
  70.     return ans;
  71. }
  72. ll  randomll () {
  73.     ll  ans = 0;
  74.     for (int i = 0; i < 4; ++i)
  75.         ans = (ans << 16) ^ rand();
  76.     return ans;
  77. }
  78.  
  79. bool isPrime(ll  n) {
  80.     if (n % 2 == 0 && n != 2||n==1)
  81.         return false;
  82.     for (int i = 0; i < 20; ++i) {
  83.         ll  a = (randomll () % (n - 1));
  84.         if (a < 0)
  85.             a += n - 1;
  86.         a += 1;
  87.  
  88.         a = binByMod(a, (n - 1) / 2, n);
  89.         if (a != n - 1 && a != 1)
  90.             return false;
  91.     }
  92.  
  93.     return true;
  94. }
  95. bool isquare(ll m)
  96. {
  97.     ll sq=(ll)(sqrt(m)+0.5);
  98.     return sq*sq==m;
  99. }
  100. ll gcdll(ll a, ll b){
  101.   if(b == 0) return a;
  102.   return gcdll(b, a%b);
  103. }
  104. bool mark[10000005];
  105. int prime[700005],K;
  106. int  prime_gen(int n)
  107. {
  108.     for(int i=3;i*i<=n;i+=2)
  109.         if(!mark[i])
  110.             for(int j=i*i,k=i<<1;j<=n;j+=k)
  111.             mark[j]=true;
  112.     int k=0;
  113.     prime[k++]=2;
  114.     for(int i=3;i<=n;i+=2)if(!mark[i])prime[k++]=i;
  115.     K=k;
  116.     return k;
  117. }
  118. ll divisor_count(ll  n)
  119. {
  120.     ll divisor=1,pow;
  121.     for(int i=0;prime[i]*prime[i]*prime[i]<=n&&i<K;i++)
  122.     {
  123.         if(n%prime[i]==0)
  124.         {
  125.             pow=0;
  126.             while(n%prime[i]==0)
  127.             {
  128.                 pow++;
  129.                 n/=prime[i];
  130.             }
  131.             divisor*=(pow+1);
  132.         }
  133.     }
  134.     if(isPrime(n))divisor*=2;
  135.     else if(isquare(n))
  136.     {
  137.         ll sq=(ll)(sqrt(n)+EPS);
  138.         if(isPrime(sq))divisor*=3;
  139.     }
  140.     else if(n!=1)divisor*=4;
  141.     return divisor;
  142. }
  143. ll divisor_count2(ll  n)
  144. {
  145.     ll nd=1,pow;
  146.     vector<ll> gg;
  147.     for(int i=0;prime[i]*prime[i]*prime[i]<=n&&i<K;i++)
  148.     {
  149.         if(n%prime[i]==0)
  150.         {
  151.             pow=0;
  152.             while(n%prime[i]==0)
  153.             {
  154.                 pow++;
  155.                 n/=prime[i];
  156.             }
  157.             gg.pb(pow);
  158.         }
  159.     }
  160.     if(isPrime(n))gg.pb(1);
  161.     else if(isquare(n))
  162.     {
  163.         ll sq=(ll)(sqrt(n)+EPS);
  164.         if(isPrime(sq))gg.pb(2);
  165.     }
  166.     else if(n!=1)gg.pb(1);
  167.     if(!gg.empty())nd=gg[0];
  168.     FOR(i,1,gg.size()-1)
  169.     {
  170.         nd=gcdll(nd,gg[i]);
  171.     }
  172.     return nd;
  173. }
  174.  
  175. int main()
  176. {
  177.     int T;
  178.     ll n,a,b;
  179.     scanf("%d",&T);
  180.     prime_gen(1000002);
  181.     FOR(cs,1,T)
  182.     {
  183.         scanf("%lld%lld",&a,&b);
  184.         n=a;
  185.         ll d=divisor_count2(n);
  186.         b*=d;
  187.         printf("Case %d: %lld\n",cs,divisor_count(b)-1);
  188.     }
  189.     return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment