bzoj3561 DZY Loves Math VI 莫比乌斯反演

Description


∑ i = 1 n ∑ j = 1 m l c m ( i , j ) g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^m {lcm(i,j)}^{gcd(i,j)} i=1nj=1mlcm(i,j)gcd(i,j)

Solution


化柿子最终可以得到
a n s = ∑ d = 1 n d d ∑ x = 1 ⌊ n d ⌋ μ ( x ) x 2 d ∑ i = 1 ⌊ n d x ⌋ i d ∑ j = 1 ⌊ m d x ⌋ j d ans=\sum_{d=1}^n d^d\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)x^{2d}\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}i^d\sum_{j=1}^{\lfloor\frac{m}{dx}\rfloor}j^d ans=d=1nddx=1dnμ(x)x2di=1dxnidj=1dxmjd

我们枚举d,然后枚举d的倍数x,直接暴力做是nlogn的

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)

typedef long long LL;
const int MOD=1000000007;
const int N=500005;

int prime[N]; LL sum[N],cm[N];

bool not_prime[N];

short mu[N];

void pre_work(int n) {
	mu[1]=1;
	rep(i,2,n) {
		if (!not_prime[i]) {
			prime[++prime[0]]=i;
			mu[i]=-1;
		}
		for (int j=1;j<=prime[0]&&i*prime[j]<=n;j++) {
			not_prime[i*prime[j]]=1;
			if (i%prime[j]==0) {
				mu[i*prime[j]]=0;
				break;
			}
			mu[i*prime[j]]=-mu[i];
		}
	}
}

LL ksm(LL x,LL dep) {
	LL res=1;
	for (;dep;dep>>=1) {
		(dep&1)?(res=res*x%MOD):0;
		x=x*x%MOD;
	}
	return res;
}

int main(void) {
	pre_work(N-1);
	int n,m; scanf("%d%d",&n,&m);
	if (n>m) std:: swap(n,m);
	rep(i,1,m) cm[i]=1;
	LL ans=0;
	rep(d,1,n) {
		for (int x=1;d*x<=m;++x) {
			cm[x]=cm[x]*x%MOD;
			sum[x]=(sum[x-1]+cm[x])%MOD;
		}
		LL wjp=ksm(d,d);
		for (int x=1;d*x<=n;++x) {
			ans=(ans+1LL*mu[x]*cm[x]%MOD*cm[x]%MOD*wjp%MOD*sum[n/d/x]%MOD*sum[m/d/x]%MOD+MOD)%MOD;
		}
	}
	printf("%lld\n", ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值