#include <cstdio>
#include <cstring>
#define R register
const int Mod = 1e9 + 7;
int n, k, tot, P[149010], Ans, mu[2000010], pow[2000010], d[2000010];
bool vis[2000010];
int Pow(R int A, R int K)
{
R int d = 1;
while(K)
{
if(K & 1) d = 1ll * A * d % Mod;
K >>= 1;
A = 1ll * A * A % Mod;
}
return d;
}
int main()
{
scanf("%d %d", &n, &k);
pow[1] = mu[1] = 1;
for(R int i = 2; i <= k; i++)
{
if(!vis[i]) P[++tot] = i, pow[i] = Pow(i, n), mu[i] = -1;
for(R int j = 1; j <= tot && P[j] * i <= k; j++)
{
vis[i * P[j]] = 1; pow[i * P[j]] = 1ll * pow[i] * pow[P[j]] % Mod;
if(i % P[j] == 0) break;
mu[i * P[j]] = -mu[i];
}
}
for(R int i = 1; i <= k; i++)
for(R int j = i; j <= k; j += i)
{
(d[j] += 1ll * pow[j / i] * mu[i] % Mod) %= Mod;
if(j + i <= k) (d[j + i] -= 1ll * pow[j / i] * mu[i] % Mod) %= Mod;
}
for(R int i = 1; i <= k; i++) (d[i] += d[i - 1]) %= Mod;
for(R int i = 1; i <= k; i++) (d[i] += Mod) %= Mod;
for(R int i = 1; i <= k; i++) (Ans += d[i] ^ i) %= Mod;
printf("%d\n", Ans);
return 0;
}
「Codeforces 915G」Coprime Arrays
最新推荐文章于 2023-05-31 10:56:26 发布