【LuoguP3327】约数个数和

题目链接

题目描述

d(x)xN,M,Ni=1Mj=1d(ij) 设 d ( x ) 为 x 的 约 数 个 数 , 给 定 N , M , 求 ∑ i = 1 N ∑ j = 1 M d ( i j )
d(x)x 其 中 d ( x ) 表 示 x 的 约 数 个 数

题解

首先要知道如下结论:
d(ij)=ik|ijl|jgcd(k,l)=1 d ( i j ) = ∑ k | i i ∑ l | j j g c d ( k , l ) = 1

然后开始随便推式子:
原式化为

i=1Nj=1Mk|iil|jjgcd(k,l)=1 ∑ i = 1 N ∑ j = 1 M ∑ k | i i ∑ l | j j g c d ( k , l ) = 1

因为我们有 d|nμ(d)=1(n=1) ∑ d | n μ ( d ) = 1 ( n = 1 )

i=1Nj=1Mk|iil|jjd|gcd(k,l)μ(d) ∑ i = 1 N ∑ j = 1 M ∑ k | i i ∑ l | j j ∑ d | g c d ( k , l ) μ ( d )
对于每一个 k,l k , l 会被算到 N/kM/l N / k ∗ M / l 次 (可去掉最外层两个sigma)
kNlMNkMld|gcd(k,l)μ(d) ∑ k N ∑ l M N k ∗ M l ∑ d | g c d ( k , l ) μ ( d )

枚举d

d=1min(N,M)μ(d)k=1Ndl=1MdNkdMld ∑ d = 1 m i n ( N , M ) μ ( d ) ∑ k = 1 N d ∑ l = 1 M d N k d ∗ M l d
d=1min(N,M)μ(d)k=1NdNkdl=1MdMld ∑ d = 1 m i n ( N , M ) μ ( d ) ∑ k = 1 N d N k d ∑ l = 1 M d M l d
g(x)=ni=1ni g ( x ) = ∑ i = 1 n n i

d=1min(N,M)μ(d)g(Nd)g(Md) ∑ d = 1 m i n ( N , M ) μ ( d ) ∗ g ( N d ) ∗ g ( M d )

筛g不能想当然地递推,会WA,而要用筛的方法
其实简单想想就会发现g(n)是n内所有数的约数个数的和,可以分别筛出每个数的约数个数,然后再求前缀和。

约数个数是个积性函数,可以筛。

#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read()
{int x=0;char ch=getchar();int t=1;for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);return x*t;
}
int n,m;
const int N=5e4+100;
typedef long long ll;
int cnt=0;int pri[N];
int c[N];//某数的质因子的次数中的最小的次数
int mu[N];int g[N];bool vis[N];
inline void prepare()
{mu[1]=1;vis[1]=1;g[1]=c[1]=1;for(register int i=2;iif(!vis[i]) {mu[i]=-1;pri[++cnt]=i;g[i]=2;c[i]=1;}for(register int j=1;j<=cnt&&(1ll*pri[j]*iregister int x=pri[j]*i;vis[x]=1;if(i%pri[j]) {mu[x]=-mu[i];g[x]=g[i]*g[pri[j]];c[x]=1;}else {g[x]=g[i]/(c[i]+1)*(c[i]+2);c[x]=c[i]+1;mu[x]=0;break;}}}for(register int i=1;i1];for(register int i=2;i1];
}int main()
{int T=read();prepare();while(T--){n=read();m=read();if(n>m) swap(n,m);register int l=0,r=0;register ll ans=0;for(l=1;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));if(r>n) r=n;ans+=1ll*(mu[r]-mu[l-1])*g[n/l]*g[m/l];}printf("%lld\n",ans);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部