EntropyIncreaser

LOJ124 sigma sum

Jan 17th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int N = 10000010, PC = 2000000, P = 1000000007;
  8.  
  9. int n, k, pc;
  10. bool f[N];
  11. int sigma[N], minp[N], pw[N], p[PC];
  12.  
  13. int pow(int a, int k);
  14.  
  15. int main() {
  16.     int ans = 0;
  17.     scanf("%d%d", &n, &k);
  18.     sigma[1] = 1;
  19.     for (int i = 2; i <= n; ++i) {
  20.         if (!f[i]) {
  21.             p[++pc] = i;
  22.             minp[i] = i;
  23.             pw[i] = sigma[i] = pow(i, k);
  24.             if (++sigma[i] >= P)
  25.                 sigma[i] = 0;
  26.         }
  27.         for (int j = 1; i * p[j] <= n; ++j) {
  28.             int ind = i * p[j];
  29.             if (i % p[j]) {
  30.                 f[ind] = true;
  31.                 minp[ind] = p[j];
  32.                 sigma[ind] = (ll) sigma[i] * sigma[p[j]] % P;
  33.             } else {
  34.                 f[ind] = true;
  35.                 minp[ind] = minp[i] * p[j];
  36.                 if (i == minp[i]) {
  37.                     sigma[ind] = ((ll)sigma[i] * pw[i] % P);
  38.                     if (++sigma[ind] >= P)
  39.                         sigma[ind] = 0;
  40.                     pw[ind] = pw[i];
  41.                 }
  42.                 else
  43.                     sigma[ind] = (ll) sigma[i / minp[i]] * sigma[minp[ind]] % P;
  44.                 break;
  45.             }
  46.         }
  47.     }
  48.     for (int i = 1; i <= n; ++i) {
  49.         ans += sigma[i];
  50.         if (ans >= P)
  51.             ans -= P;
  52.     }
  53.     printf("%d\n", ans);
  54.     return 0;
  55. }
  56.  
  57. inline int pow(int a, int k) {
  58.     int ret = 1;
  59.     while (k) {
  60.         if (k & 1)
  61.             ret = (ll) ret * a % P;
  62.         a = (ll) a * a % P;
  63.         k >>= 1;
  64.     }
  65.     return ret;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment