[ABC162E] Sum of gcd of Tuples (Hard)

题面翻译

给定n,k,求

a1=1ka2=1ka3=1kan=1kgcd(a1,a2,a3,,an) mod 1000000007

制約

  • 2  N  105
  • 1  K  105

思路点拨

我们看到这么多 gcd 的式子,我们自然想到莫比乌斯反演。

d=1kda1=1ka2=1k...an=1k[gcd(a1,a2,...,an)=d]

d=1kda1=1kda2=1kd...an=1kd[gcd(a1,a2,...,an)=1]

i=1kdt=1kdμ(t)(ktk)n

蛮力算就是 O(nlognlogn)

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-f;
		ch=getchar(); 
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int n,m,k;
const int mod=1e9+7,N=1e5,MAXN=1e5+10;
int qpow(int a,int b){
	int ans=1,base=a;
	while(b){
		if(b&1)ans=ans*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return ans;
}
int mu[MAXN];
bool vis[MAXN];
void prepare(){
	for(int i=1;i<=N;i++)
		mu[i]=1;
	for(int i=2;i<=N;i++){
		if(vis[i]) continue;
		mu[i]=-1;
		for(int j=i*2;j<=N;j+=i){
			vis[j]=1;
			mu[j]=-mu[j];
			if(j%(i*i)==0) mu[j]=0;
		}
	}
}
signed main(){
	prepare();
	n=read(),k=read();
	int ans=0;
	for(int d=1;d<=k;d++)
		for(int t=1;t<=(k/d);t++)
			ans=(ans+(mu[t]+mod)*d%mod*qpow(k/(d*t),n)%mod)%mod;
	cout<<ans; 
	return 0;
}
posted @   Diavolo-Kuang  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示