Saturday, April 4, 2020

[Codeforces] F. Make It One

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. Make It One
Source            : Codeforces
Category          : Number Theroy
Algorithm         : Mobius Function 
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. #define ll          long long int  
  4. #define endl        '\n'  
  5.   
  6. using namespace std;  
  7.   
  8. static const int maxn = 3e5 + 5;  
  9. static const long long mod = 1e9 + 7;  
  10.   
  11. int fre[maxn];  
  12. int divi[maxn];  
  13. bool isprime[maxn];  
  14. vector <int> prime;  
  15.   
  16. void seive()  
  17. {  
  18.       for (int i = 2; i < maxn; i++) isprime[i] = true;  
  19.       for (int i = 2; i < maxn; i++)  
  20.       {  
  21.             if (isprime[i]) prime.push_back(i);  
  22.             for (int j = 1; 1LL * i * j < maxn; j++)  
  23.             {  
  24.                   isprime[i * j] = false;  
  25.                   divi[i] += fre[i * j];  
  26.             }  
  27.       }  
  28. }  
  29.   
  30. int mobius[maxn];  
  31.   
  32. void calc_mobius()  
  33. {  
  34.       for (int i = 1; i < maxn; i++) mobius[i] = 1;  
  35.       for (int p : prime)  
  36.       {  
  37.             if (1LL * p * p > maxn) break;  
  38.             int x = p * p;  
  39.             for (int j = x; j < maxn; j += x) mobius[j] = 0;  
  40.       }  
  41.       for (int p : prime)  
  42.       {  
  43.             for (int j = p; j < maxn; j += p) mobius[j] *= -1;  
  44.       }  
  45. }  
  46.   
  47. long long binaryExpo(long long a, long long p, long long m)  
  48. {  
  49.       if (p == 0) return 1 % m;  
  50.       if (p == 1) return a % m;  
  51.       if (p & 1) return (a % m * binaryExpo(a, p - 1, m) % m) % m;  
  52.       long long ret = binaryExpo(a, p / 2, m);  
  53.       return (ret % m * ret % m) % m;  
  54. }  
  55.   
  56. long long mod_inv(long long a, long long m)  
  57. {  
  58.       return binaryExpo(a, m - 2, m);  
  59. }  
  60.   
  61. long long fact[maxn];  
  62. long long inv[maxn];  
  63.   
  64. void calc_fact()  
  65. {  
  66.       fact[0] = 1;  
  67.       inv[0] = 1;  
  68.       for (int i = 1; i < maxn; i++)  
  69.       {  
  70.             fact[i] = (1LL * i * fact[i - 1]) % mod;  
  71.             inv[i] = mod_inv(fact[i], mod);  
  72.       }  
  73. }  
  74.   
  75. long long nCr(int n, int r)  
  76. {  
  77.       if (n < r) return 0;  
  78.       if (n == r) return 1;  
  79.       long long nom = fact[n];  
  80.       long long dem = (fact[r] * fact[n - r]) % mod;  
  81.       long long ncr = (nom * mod_inv(dem, mod)) % mod;  
  82.       return ncr;  
  83. }  
  84.   
  85. ll count_coprime(int r)  
  86. {  
  87.       ll coprime = 0;  
  88.       for (int d = 1; d < maxn; d++)  
  89.       {  
  90.             ll ncr = nCr(divi[d], r);  
  91.             coprime += (mobius[d] * ncr + mod) % mod;  
  92.             coprime %= mod;  
  93.       }  
  94.       return coprime;  
  95. }  
  96.   
  97. signed main()  
  98. {  
  99.       ios_base::sync_with_stdio(false);  
  100.       cin.tie(nullptr);  
  101.   
  102.       #ifndef ONLINE_JUDGE  
  103.             freopen("in.txt""r", stdin);  
  104.       #endif // ONLINE_JUDGE  
  105.   
  106.   
  107.       int n;  
  108.       cin >> n;  
  109.       for (int i = 1; i <= n; i++)  
  110.       {  
  111.             int x;  
  112.             cin >> x;  
  113.             if (x == 1) return (cout << 1), 0;  
  114.             fre[x]++;  
  115.       }  
  116.       divi[1] = n;  
  117.       seive();  
  118.       calc_mobius();  
  119.       calc_fact();  
  120.       for (int r = 2; r < 10; r++)  
  121.       {  
  122.             ll coprime = count_coprime(r);  
  123.             if (coprime > 0) return (cout << r << endl), 0;  
  124.       }  
  125.       cout << -1 << endl;  
  126. }  
  127. �  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.