C 华华给月月出题 积性函数

https://ac.nowcoder.com/acm/contest/392/C

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod = 1e9 + 7;
 5 const int maxn = 1.3e7 + 5;
 6 int prime[maxn], n;
 7 ll sum[maxn];
 8 bool v[maxn];
 9 ll quickpow(ll x,ll y)
10 {
11     ll res = 1;
12     while(y){
13         if(y & 1) res = res*x%mod;
14         y >>= 1;
15         x = x*x%mod;
16     }
17     return res;
18 }
19 ll primes()
20 {
21     int m = 0;
22     for(int i = 2; i <= n; i++){
23         if(!v[i]){
24             prime[++m] = i;
25             v[i] = 1;
26             sum[i] = quickpow(i,n);
27         }
28         for(int j = 1; j <= m; j++){
29             if(i*prime[j] > n || i%prime[j] == 0) break;
30             v[i*prime[j]] = 1;
31             sum[i*prime[j]] = sum[i]*sum[prime[j]]%mod;
32         }
33     }
34     ll ans = 1;
35     for(int i = 2; i <= n; i++){
36         ans ^= sum[i];
37     }
38     return ans;
39 }
40 int main()
41 {
42     cin>>n;
43     printf("%lld\n",primes());
44     return 0;
45 }

 

posted @ 2021-03-07 09:17  古比  阅读(64)  评论(0编辑  收藏  举报