您的位置:首页 > 其它

【题解】SDOI-2012 Longge的问题

2018-02-26 22:27 190 查看
转载注:

转载自PinkRabbit的博客园

原文地址

以下是转载内容:

题目传送门:链接

能自己推出正确的式子的感觉真的很好!

题意简述:

求∑ni=1gcd(i,n)∑i=1ngcd(i,n)。n≤232n≤232。

题解:

我们开始化简式子:

∑ni=1gcd(i,n)∑i=1ngcd(i,n)

=∑nj=1(j×∑ni=1[gcd(i,n)=j])=∑j=1n(j×∑i=1n[gcd(i,n)=j])

=∑nj=1(j×∑ni=1[gcd(i/j,n/j)=1](j|i,j|n))=∑j=1n(j×∑i=1n[gcd(i/j,n/j)=1](j|i,j|n))

=∑nj=1(j×ϕ(n/j)(j|n))=∑j=1n(j×ϕ(n/j)(j|n))

=∑j|n(j×ϕ(n/j))=∑j|n(j×ϕ(n/j))

到这里就可以直接计算了。

但是还可以进一步化简!(以下的p为质数)

∑j|n(j×ϕ(n/j))∑j|n(j×ϕ(n/j))

=∑j|n(n/j×ϕ(j))=∑j|n(n/j×ϕ(j))

=∑j|n(n/j×(j⋅∏p|jp−1p))=∑j|n(n/j×(j⋅∏p|jp−1p))

=∑j|n(n⋅∏p|jp−1p)=∑j|n(n⋅∏p|jp−1p)

=n×∑j|n∏p|jp−1p=n×∑j|n∏p|jp−1p

接下来我们令n=pc11pc22pc33⋯pckkn=p1c1p2c2p3c3⋯pkck,并定义fi=pi−1pifi=pi−1pi。

那么n的因子j可以表示为:j=pc11pc22pc33⋯pckkj=p1c1p2c2p3c3⋯pkck,满足0≤ci≤bi0≤ci≤bi。

那么∏p|jp−1p=∏ki=1fi[ci>0]∏p|jp−1p=∏i=1kfi[ci>0]。

我们观察一类∏ki=1fi[ci>0]∏i=1kfi[ci>0]相等的j,它们必要满足在ii相等的情况下,cici同时大于00或cici同时等于00。

那么这一类的jj有多少个呢?如果这类j有质因子pq1,pq2,pq3,⋯,pqgpq1,pq2,pq3,⋯,pqg。

那么这类jj的答案为∏gi=1fqi∏i=1gfqi,而个数为∏gi=1bqi∏i=1gbqi。

bibi就是原来n的质因数分解的指数。

那么对答案的贡献为:∏gi=1χqi∏i=1gχqi。这里χi=fi⋅biχi=fi⋅bi。

发现每一个质因子的贡献都是独立的,那么最后我们枚举n的每一个质因子取不取,得到最后的答案:n⋅∏ki=1(χi+1)n⋅∏i=1k(χi+1)。

举个例子:如果n只有3个质因子,那么答案为n⋅(1+χ1+χ2+χ3+χ1χ2+χ1χ3+χ2χ3+χ1χ2χ3)n⋅(1+χ1+χ2+χ3+χ1χ2+χ1χ3+χ2χ3+χ1χ2χ3)。

显然可以化简为:n⋅(χ1+1)⋅(χ2+1)⋅(χ3+1)n⋅(χ1+1)⋅(χ2+1)⋅(χ3+1)。

当然可以类比到质因数更多的情况。

总之,答案就是:n⋅∏ki=1bipi−bi+pipin⋅∏i=1kbipi−bi+pipi。

代码:

#include<cstdio>
long long n;
long long f(){
long long ans=n; long long i;
for(i=2;i*i<=n;++i) if(n%i==0){
int b=0;
while(n%i==0) ++b,n/=i;
ans/=i;
ans*=b*i-b+i;
} if(n>1) ans/=n, ans*=n+n-1;
return ans;
}
int main(){
scanf("%lld",&n);
printf("%lld",f());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: