题解:CF915G Coprime Arrays
题意
我们称一个大小为
的数组 互质,当且仅当 。 给定
,对于每个 ,你都需要确定这样的数组的个数——长度为 的互质数组 ,满足对每个 ,都有 。
分析
我们设
按照题意,可以列出这样一个式子:
简单推一下式子:
因为
变换求值顺序,枚举
于是我们得到了一个
在
有个显然的引理:
据此考虑差分:
根据上述引理,当且仅当
所以,我们可以枚举
通过前缀和统计答案。
时间复杂度
Code
#include<bits/stdc++.h> using namespace std; #define maxn 2000006 #define mod 1000000007 int mu[maxn]; bool vis[maxn]; vector<int> pri; void init() { mu[1]=1; for(int i=2;i<maxn;i++) { if(!vis[i]) mu[i]=-1, vis[i]=1, pri.emplace_back(i); for(auto p:pri) { if(p*i>=maxn) break; vis[p*i]=1; if(i%p==0) break; mu[i*p]=-mu[i]; } } } int ksm(int64_t x, int l) { int64_t ret=1; for(;l;l>>=1, x=x*x%mod) if(l&1) ret=ret*x%mod; return ret; } int lev[maxn], det[maxn]; int main() { int n, k; cin>>n>>k; init(); for(int i=1;i<=k;i++) lev[i]=ksm(i, n); for(int d=1;d<=k;d++) for(int j=1;d*j<=k;j++) det[d*j]=((det[d*j]+mu[d]*(mod+(lev[j]-lev[j-1])%mod)%mod)%mod+mod)%mod; int ans=0, otp=0; for(int i=1;i<=k;i++) otp=(otp+(i^(ans=(ans+det[i])%mod)))%mod; cout<<otp%mod; }
本文作者:Jimmy-LEEE
本文链接:https://www.cnblogs.com/redacted-area/p/18389462
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步