BotByte

Mobius Function.cpp

Jun 1st, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. /*
  2.     CF 915G
  3. */
  4.  
  5. #define _CRT_SECURE_NO_DEPRECATE
  6. #pragma comment(linker, "/STACK:167772160000")
  7.  
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. #define ll long long
  13. #define MAX 2000001
  14. #define MOD 1000000007
  15. vector<int> V[MAX];
  16. bool prime[MAX];
  17. int mu[MAX];
  18. ll f[MAX], power[MAX];
  19.  
  20. void sieve()
  21. {
  22.     memset(prime, true, sizeof prime);
  23.     for(int i=2; i<MAX; i++){
  24.         mu[i] = 1;
  25.     }
  26.     for(int i=2; i<MAX; i++){
  27.         if(mu[i] == 0) continue;
  28.         if(prime[i]) mu[i] = mu[i]*-1;
  29.         for(int j=2*i; j<MAX; j+=i){
  30.             if((prime[i] == true)&& (j%(i*i) == 0)) mu[j] = 0;
  31.             if(prime[i]) mu[j] = mu[j]*-1;
  32.             if(prime[i]) prime[j] = false;
  33.             V[j].push_back(i);
  34.         }
  35.     }
  36. }
  37.  
  38. ll bigMod(ll a, ll r)
  39. {
  40.     if(r == 0) return 1;
  41.     if(r == 1) return a%MOD;
  42.     ll ret = bigMod(a, r/2);
  43.     ret = (ret*ret)%MOD;
  44.     if(r & 1) ret = (ret*a)%MOD;
  45.     return ret;
  46. }
  47.  
  48. int main()
  49. {
  50.     ios::sync_with_stdio(false); cin.tie(0);
  51.     sieve();
  52.     ll n, k;
  53.     scanf("%lld %lld", &n, &k);
  54.     for(ll i=0; i<=k; i++){
  55.         power[i] = bigMod(i, n);
  56.     }
  57.     memset(f, 0, sizeof f);
  58.     ll tot = 0, curAns = 0;
  59.     for(ll i=2; i<=k; i++){
  60.         for(ll j=0; j<V[i].size(); j++){
  61.             ll div = V[i][j];
  62.             ll toAdd = power[i/div]-f[div];
  63.             toAdd = (toAdd+MOD)%MOD;
  64.             f[div] = power[i/div];
  65.             toAdd = toAdd*mu[div];
  66.             toAdd = (toAdd+MOD)%MOD;
  67.             curAns += toAdd;
  68.         }
  69.         f[i] = 1;
  70.         curAns += f[i]*mu[i];
  71.         ll cur = power[i]+curAns;
  72.         cur = (cur+MOD)%MOD;
  73.         cur = cur^i;
  74.         cur = cur%MOD;
  75.         tot += cur;
  76.     }
  77.     tot = tot%MOD;
  78.     cout << tot;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment