P8570 [JRKSJ R6] 牵连的世界 题解

推式子萌新来推推看式子。

i=1nj=1mσ(ij)φ(ij)

先把 σφ 展开来。

i=1nj=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))x|iy|j[gcd(x,y)=1]

替换 [gcd(x,y)]=1

i=1nj=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))x|iy|jd|x,d|yμ(d)

换个枚举顺序,把 d 的枚举提前。

i=1nj=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))d|gcd(i,j)σ(id)σ(jd)μ(d)

再换个枚举顺序,把 d 的枚举再提前。

d=1ni=1n/dj=1m/dφ(id)φ(jd)gcd(i,j)dφ(gcd(i,j)d)σ(i)σ(j)μ(d)

枚举 z=gcd(i,j)

d=1nμ(d)dz=1n/di=1n/dzj=1m/dzφ(idz)φ(jdz)zφ(zd)σ(iz)σ(jz)[gcd(i,j)=1]

换个顺序。

d=1nμ(d)dz=1n/dzφ(zd)i=1n/dzσ(iz)φ(idz)j=1m/dzσ(jz)φ(jdz)[gcd(i,j)=1]

再替换 [gcd(i,j)=1]

d=1nμ(d)dz=1n/dzφ(zd)i=1n/dzσ(iz)φ(idz)j=1m/dzσ(jz)φ(jdz)w|i,w|jμ(w)

w 放到前面枚举。

d=1nμ(d)dz=1n/dzφ(zd)w=1n/dzμ(w)i=1n/dzwσ(iwz)φ(iwdz)j=1m/dzwσ(jwz)φ(jwdz)

定义两个函数:

A(x,y)=i=1n/xyσ(iy)φ(ixy)

B(x,y)=i=1m/xyσ(iy)φ(ixy)

原式可以转化为:

d=1nμ(d)dz=1n/dzφ(zd)w=1n/dzμ(w)A(d,zw)B(d,zw)

首先可以发现:乘积小于等于 n 的三元组个数是 O(nlog2n) 级别的。所以我们可以在 O(nlog2n) 的时间复杂度内计算出所有 A(x,y)B(x,y)

如果已经算出了 AB,剩下的按照上面的式子算,容易发现也是 O(nlog2n) 的。所以我们用 O(nlog2n) 完成了这道题。

// mu 表示莫比乌斯函数,phi 表示欧拉函数,D 表示约束个数和函数,inv 表示逆元
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	init();
	ll ans=0;
	for (int d=1;d<=n;d++)
	{
		for (int j=1;j<=n/d;j++) 
		{
			a[j]=0;
			for (int i=1;i<=n/(d*j);i++) a[j]=(a[j]+1ll*D[i*j]*phi[i*d*j]%mod)%mod;
			b[j]=0;
			for (int i=1;i<=m/(d*j);i++) b[j]=(b[j]+1ll*D[i*j]*phi[i*d*j]%mod)%mod;
		}
		for (int j=1;j<=n/d;j++) 
		{
			for (int w=1;w<=n/(d*j);w++)
			{
				ans=ans+1ll*mu[d]*mu[w]*inv[phi[j*d]]*d%mod*j%mod*a[j*w]%mod*b[j*w]%mod;
				ans=(ans+mod)%mod;
			}
		}
	}
	cout << ans;
	return 0;
}

posted @   Little09  阅读(93)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示