「Codeforces 915G」Coprime Arrays

CF915G

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值