Sum of gcd of Tuples (Hard)
题面描述
题解
求∑ka1=1∑ka2=1···∑kan=1gcd(a1,a2,···,an)
设f(d)=∑ka1=1∑ka2=1···∑kan=1[gcd(a1,a2,···,an)=d]
g(d)=∑d|d′,d′≤kf(d′)=[nd]n
根据莫比乌斯反演定理
f(d)=∑d|d′,d′≤kμ(d′d)g(d′)
ans=∑ki=1f(i)
点击查看代码
#include<functional>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<deque>
#define ll long long
using namespace std;
const int maxn=1e5+101;
const int MOD=1e9+7;
const int inf=2147483647;
int read(){
int x=0,f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';
return x*f;
}
int mu[maxn];
int tot,is[maxn],prime[maxn];
int n,k;
ll g[maxn];
void get_mu(){
mu[1]=1;
for(int i=2;i<=k;i++){
if(!is[i])prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot && prime[j]<=k/i;j++){
is[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
}
}
ll power(ll x,ll y){
ll ans=1;
while(y){
if(y&1)ans=ans*x%MOD;
y>>=1;x=x*x%MOD;
}
return (ans%MOD+MOD)%MOD;
}
int main(){
n=read();k=read();get_mu();
for(int i=1;i<=k;i++)g[i]=power((ll)(k/i),(ll)n);
ll ans=0;
for(int i=1;i<=k;i++){
ll num=0;
for(int j=i;j<=k;j+=i){
(num+=(ll)mu[j/i]*g[j]%MOD)%=MOD;
}
num=(num+MOD)%MOD;
(ans+=num*i%MOD)%=MOD;
ans=(ans+MOD)%MOD;
}
printf("%lld",ans%MOD);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端