muntasir007

Untitled

Feb 20th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAX 100000000
  4. vector <long long int> primes;
  5. long long int GCD( long long int a, long long int b ) {
  6. if( b == 0 ) return a;
  7. if( a < b ) swap( a, b );
  8. int r = a % b;
  9. return GCD( b, r );
  10. }
  11. int prime[MAX];
  12. int setBit( int n, int position ) {
  13. n = n | ( 1 << position );
  14. return n;
  15. }
  16. bool checkBit(int n, int position) {
  17. return n & ( 1 << position );
  18. }
  19. void primeGenerator( int n ) {
  20. int x = sqrt( n );
  21. primes.push_back((long long)2);
  22. prime[0] = setBit( prime[0], 0 );
  23. prime[0] = setBit( prime[0], 1 );
  24. for( int i = 4; i <= n; i += 2 )
  25. prime[ i >> 5 ] = setBit( prime[ i >> 5 ], i & 31 );
  26. int i;
  27. for( i = 3; i <= x; i += 2 ) {
  28. if( !checkBit( prime[ i >> 5 ], i & 31 ) ) {
  29. primes.push_back((long long)i);
  30. for( int j = i+i; j <= n; j += i )
  31. prime[ j >> 5 ] = setBit( prime[ j >> 5 ], j & 31 );
  32. }
  33. }
  34.  
  35. for (; i<100000000; i+=2) {
  36. if( !checkBit( prime[ i >> 5 ], i & 31 ) ) {
  37. primes.push_back((long long)i);
  38. }
  39. }
  40. return;
  41. }
  42. int main() {
  43. primeGenerator(100000000);
  44.  
  45. int T;
  46.  
  47. scanf("%d", &T);
  48. int cs;
  49.  
  50. for (cs=1; cs<=T; cs++) {
  51. vector <int> ber;
  52. vector <int> aer;
  53. long long int a, b, bb;
  54. scanf("%lld %lld", &a, &b);
  55. bb = b;
  56. long long int i;
  57.  
  58. for (i=0; primes[i]*primes[i] <= b; i++) {
  59.  
  60. if (b % primes[i] == 0) {
  61. while (b%primes[i] == 0) {
  62. ber.push_back(primes[i]);
  63. b/=primes[i];
  64. }
  65. }
  66. }
  67. if (b>=2) ber.push_back(b);
  68.  
  69. for (i=0; primes[i]*primes[i] <= a; i++) {
  70. if (a % primes[i] == 0) {
  71. while (a%primes[i] == 0) {
  72. aer.push_back(primes[i]);
  73. a/=primes[i];
  74. }
  75. }
  76. }
  77. if (a>=2) aer.push_back(a);
  78. long long int gcd = 0, cnt=0, j =0, k = 0, xx = aer[0];
  79. i=0;
  80. while (aer[i] == xx && i<aer.size()) {
  81. i++;
  82. gcd++;
  83. }
  84.  
  85. for (; i<aer.size(); i++) {
  86. xx = aer[i];
  87. cnt =0;
  88. while (aer[i] == xx && i<aer.size()) {
  89. i++;
  90. cnt++;
  91. }
  92. gcd = GCD(cnt, gcd);
  93. }
  94.  
  95. for (i=0; primes[i]*primes[i] <= gcd; i++) {
  96. if (gcd % primes[i] == 0) {
  97. while (gcd%primes[i] == 0) {
  98. ber.push_back(primes[i]);
  99. gcd/=primes[i];
  100. }
  101. }
  102. }
  103. if (gcd>=2) ber.push_back(gcd);
  104. long long int ans = 1;
  105.  
  106. sort(ber.begin(), ber.end());
  107.  
  108. for (i=0; i<ber.size(); ) {
  109. xx = ber[i];
  110. cnt =0;
  111. while (ber[i] == xx && i<ber.size()) {
  112. i++;
  113. cnt++;
  114. }
  115. ans*= (cnt+1);
  116. }
  117.  
  118. printf("Case %d: %lld\n",cs, ans-1);
  119. }
  120. return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment