Advertisement
ahamed210

h_num_divide_N!_pow_M

Mar 20th, 2021
883
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MOD 10000007
  4.  
  5. long long prime[300000], nprime = 0;
  6. long long mark[1000002];
  7. long long prime_factors_of_m[10000], k = 0;
  8.  
  9. void sieve(long long n)
  10. {
  11.     long long i, j, limit = sqrt(n+1);
  12.     /// 1 is not prime
  13.     mark[1] = 1;
  14.     /// Almost all the even number are not prime except 2
  15.     for(i = 4; i <= n; i+=2) mark[i] = 1;
  16.     /// 2 is the first prime
  17.     prime[nprime++] = 2;
  18.     for(i = 3; i <= n; i+=2)
  19.     {
  20.         if(!mark[i])
  21.         {
  22.             prime[nprime++] = i;
  23.             if(i <= limit)
  24.             {
  25.                 for(j = i*i; j <= n; j += (i*2))
  26.                 {
  27.                     ///multiples of the primes are not prime
  28.                     mark[j] = 1;
  29.                 }
  30.             }
  31.         }
  32.     }
  33. }
  34.  
  35. void prime_factors(long long n)
  36. {
  37.     long long limit = sqrt(n+1);
  38.     for(long long i = 2; i <= limit; i++)
  39.     {
  40.         if(i == sqrt(n) && mark[i] == 0){
  41.             prime_factors_of_m[k++] = i;
  42.         }
  43.         else if(n % i == 0){
  44.             if(mark[i] == 0) prime_factors_of_m[k++] = i;
  45.             if(mark[n/i] == 0) prime_factors_of_m[k++] = n/i;
  46.         }
  47.     }
  48. }
  49.  
  50. long long highest_power_of_prime_m(long long n, long long m)
  51. {
  52.     long long count = 0;
  53.     for(long long i = 1; pow(m, i) < n; i++) count += (n / (pow(m,i)));
  54.     return count;
  55. }
  56.  
  57. long long highest_power_of_m(long long n, long long m)
  58. {
  59.     prime_factors(m);
  60.     long long ara[k];
  61.     long long pprime[k];
  62.     memset(ara, 0, sizeof(ara));
  63.     memset(pprime, 0, sizeof(pprime));
  64.  
  65.     for(long long i = 0; i < k; i++)
  66.     {
  67.         long long count = 0;
  68.         for(long long j = 1; pow(prime_factors_of_m[i], j) < n; j++) count += (n / (pow(prime_factors_of_m[i],j)));
  69.         ara[i] = count;
  70.     }
  71.     ///for(int i = 0; i < k; i++) cout << ara[i] <<endl;
  72.  
  73.     for(long long i = 0; i < k; i++){
  74.         long long count = 0;
  75.         while(m % prime_factors_of_m[i] == 0){
  76.             count++;
  77.             m /= prime_factors_of_m[i];
  78.         }
  79.         pprime[i] = count;
  80.     }
  81.     ///for(int i = 0; i < k; i++) cout << pprime[i] <<endl;
  82.  
  83.     long long p = ara[0]/pprime[0];
  84.     for(long long i = 1; i < k; i++) p = min(p, ara[i]/pprime[i]);
  85.     //cout << p << endl;
  86.     return p;
  87. }
  88.  
  89. long long bigmod(long long a, long long b)
  90. {
  91.     if(b == 1) return a % MOD;
  92.     if(b % 2 == 1){
  93.         long long x = bigmod(a, b-1) % MOD;
  94.         x = (x * a) % MOD;
  95.         return x;
  96.     }
  97.     else{
  98.         long long x = bigmod(a, b/2) % MOD;
  99.         x = (x * x) % MOD;
  100.         return x;
  101.     }
  102. }
  103.  
  104. int main()
  105. {
  106.     memset(mark, 0, sizeof(mark));
  107.     sieve(1000002);
  108.  
  109.     long long n, m, power;
  110.     long long ft;
  111.     scanf("%lld", &ft);
  112.     for(long long i = 0; i < ft; i++){
  113.         scanf("%lld %lld", &n, &m);
  114.         memset(prime_factors_of_m, 0, sizeof(prime_factors_of_m));
  115.         /// m is a prime number
  116.         if(mark[m] == 0) power = highest_power_of_prime_m(n, m);
  117.         else power = highest_power_of_m(n, m);
  118.         //highest_power_of_m(n, m);
  119.         //cout << power << endl;
  120.         cout << bigmod(m, power) << endl;
  121.     }
  122.     return 0;
  123. }
  124.  
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement