Typesetting math: 100%

[luogu5176] 公约数

0|1题目描述


ni=1mj=1pk=1gcd(ij,ik,jk)×gcd(i,j,k)×(gcd(i,j)gcd(i,k)×gcd(j,k)+gcd(i,k)gcd(i,j)×gcd(j,k)+gcd(j,k)gcd(i,j)×gcd(i,k))

由于答案可能过大,输出答案对10^9+7109+7取模的值。

0|1输入输出


第一行一个正整数T,为数据组数。

下面T行,每行3个整数,为n,m,p。

0|1输出格式


共T行,每行一个整数,为答案。

0|1输入输出


2 10 12 11 30 20 25

0|1输出样例


25302 573830

0|1Solution


挺巧妙的一个题。

注意到gcd的一个性质,我们只考虑一个质因子,设i=px,j=py,k=pz,可以得到:

gcd(i,j)=pmin(x,y),gcd(i,j,k)=pmin(x,y,z)

那么根据这个我们可以尝试着化简题目给出的式子,通分之后把分母提出来,和前面两项乘起来就是:

res=gcd(i,j,k)×gcd(ij,jk,ki)gcd(i,j)×gcd(j,k)×gcd(i,k)

由于这里只考虑一个质因子,我们可以两边取log,然后设min(x,y,z)=x,即x为最小值,这对答案是没有影响的,那么式子可以变成这样:

logp(res)=2x+min(y,y+zx,z)(2x+min(y,z))

可以发现y+zxy,y+zxz,所以可以得到:

logp(res)=2x+min(y,z)(2x+min(y,z))

所以:

logp(res)=0,res=1

所以我们可以惊奇的发现,前面两项和分母约掉了,剩下的式子写出来就是:

ans=ijkgcd(i,j)2+gcd(j,k)2+gcd(i,k)2

这个直接大力反演就好了。

#include<bits/stdc++.h> using namespace std; void read(int &x) { x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f; } void print(int x) { if(x<0) putchar('-'),x=-x; if(!x) return ;print(x/10),putchar(x%10+48); } void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} const int maxn = 2e7+10; const int mod = 1e9+7; int pri[maxn/10],mu[maxn],f[maxn],vis[maxn],tot; void sieve() { mu[1]=f[1]=1; for(int i=2;i<maxn;i++) { if(!vis[i]) pri[++tot]=i,mu[i]=-1,f[i]=1ll*i*i%mod-1; for(int v,j=1;j<=tot&&i*pri[j]<maxn;j++) { vis[v=i*pri[j]]=1; if(i%pri[j]==0) {f[v]=1ll*f[i]*pri[j]%mod*pri[j]%mod;break;} f[v]=1ll*f[i]*f[pri[j]]%mod,mu[v]=-mu[i]; } } for(int i=1;i<maxn;i++) f[i]=(f[i]+f[i-1])%mod; } int calc(int n,int m) { int T=1,res=0; while(T<=min(n,m)) { int pre=T;T=min(n/(n/T),m/(m/T)); res=(res+1ll*(f[T]-f[pre-1])*(n/T)%mod*(m/T)%mod)%mod;T++; }return (res+mod)%mod; } int main() { sieve(); int T,n,m,p;read(T); while(T--) read(n),read(m),read(p),write(((1ll*calc(n,m)*p%mod+1ll*calc(n,p)*m%mod)%mod+1ll*calc(m,p)*n%mod)%mod); return 0; }

__EOF__

作  者Hyscere
出  处https://www.cnblogs.com/hbyer/p/10512796.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   Hyscere  阅读(204)  评论(0编辑  收藏  举报
编辑推荐:
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· 从 Windows Forms 到微服务的经验教训
点击右上角即可分享
微信分享提示