[国家集训队]Crash的数字表格(莫比乌斯反演)

这道题在bzoj有多组数据,那么洛谷题解里的双重分块在bzoj就会T

那我就讲一下只有一重分块的做法

时间复杂度(大概) O(\(N_{max}+T\sqrt{N_i}\)) 其中T为数据组数

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m\operatorname{lcm(i,j)} \]

\[=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\frac{i\cdot j}{\gcd(i,j)} \]

\[=\sum\limits_{i=1}^n \sum\limits_{i=1}^m \sum\limits_{d=1}^{min(n,m)}\frac{i\cdot j}d[gcd(i,j)=d] \]

\[=\sum\limits_{d=1}^{min(n,m)} \sum\limits_{i=1}^{\lfloor\frac{n}d\rfloor} \sum\limits_{i=1}^{\lfloor\frac{m}d\rfloor} dij\cdot [gcd(i,j)=1] \]

\[=\sum\limits_{d=1}^{min(n,m)} \sum\limits_{i=1}^{\lfloor\frac{n}d\rfloor} \sum\limits_{i=1}^{\lfloor\frac{m}d\rfloor} dij \sum\limits_{x|gcd(i,j)}^{}μ(x) \]

\[=\sum\limits_{d=1}^{min(n,m)} \sum\limits_{i=1}^{\lfloor\frac{n}d\rfloor} \sum\limits_{i=1}^{\lfloor\frac{m}d\rfloor} dij \sum\limits_{x|i,x|j}μ(x) \]

然后把μ(x)和d调到前面去,i变成ix,j变成jx

\[=\sum\limits_{d=1}^{min(n,m)}d \sum\limits_{x=1}^{min(\lfloor\frac{n}d\rfloor,\lfloor\frac{m}d\rfloor)}μ(x) \sum\limits_{i=1}^{\lfloor\frac{n}{dx}\rfloor}ix \sum\limits_{j=1}^{\lfloor\frac{m}{dx}\rfloor}jx \]

然后把x也调到前面去

\[=\sum\limits_{d=1}^{min(n,m)}d \sum\limits_{x=1}^{min(\lfloor\frac{n}d\rfloor,\lfloor\frac{m}d\rfloor)}x^2μ(x) \sum\limits_{i=1}^{\lfloor\frac{n}{dx}\rfloor} \sum\limits_{j=1}^{\lfloor\frac{m}{dx}\rfloor}ij \]

然后等差数列

\[=\sum\limits_{d=1}^{min(n,m)}d \sum\limits_{x=1}^{min(\lfloor\frac{n}d\rfloor,\lfloor\frac{m}d\rfloor)}x^2\mu(x) \frac{(1+\lfloor\frac{n}{dx}\rfloor)\lfloor\frac{n}{dx}\rfloor}{2}\frac{(1+\lfloor\frac{m}{dx}\rfloor)\lfloor\frac{m}{dx}\rfloor}{2} \]

在洛谷的话推到这一步就够了

但是想要在bzoj过这道题还要接着优化

然后设T=dx,所以x=\(\frac{T}{d}\)

\[=\sum\limits_{T=1}^{min(n,m)} \frac{(1+\lfloor\frac{n}{T}\rfloor)\lfloor\frac{n}{T}\rfloor}{2}\frac{(1+\lfloor\frac{m}{T}\rfloor)\lfloor\frac{m}{T}\rfloor}{2} \sum\limits_{d|T}d\frac{T^2}{d^2}\mu(\frac{T}{d}) \]

由于对称性

\[=\sum\limits_{T=1}^{min(n,m)} \frac{(1+\lfloor\frac{n}{T}\rfloor)\lfloor\frac{n}{T}\rfloor}{2}\frac{(1+\lfloor\frac{m}{T}\rfloor)\lfloor\frac{m}{T}\rfloor}{2} \sum\limits_{d|T}\frac{T}{d}d^2\mu({d}) \]

\[=\sum\limits_{T=1}^{min(n,m)} \frac{(1+\lfloor\frac{n}{T}\rfloor)\lfloor\frac{n}{T}\rfloor}{2}\frac{(1+\lfloor\frac{m}{T}\rfloor)\lfloor\frac{m}{T}\rfloor}{2} \sum\limits_{d|T}Td\mu({d}) \]

然后我们设

\[g(T)=\sum\limits_{d|T}Td\mu({d}) \]

然后可以发现g是一个积性函数

所以有

\[g(\Pi P_i^{ai})=\Pi g(P_i^{ai}) \]

\[=\Pi (T*P_i^{0}*\mu(1)+T*P_i*\mu(1)) \]

\[=\Pi (T-T*P_i) \]

\[=\Pi (T*(1-P_i)) \]

因此

\[g(p)=1-p \]

\[g(p^k)=g(p^{k-1}) \]

当np互质时,有

\[g(np)=g(n)*g(p) \]

然后筛一筛就出来了

代码:

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define N 10000010
using namespace std;
const int mod=20101009;
int vis[N],prim[N/10],mu[N],low[N],sum[N],cnt;
void pre(int n){
	mu[1]=1;
	sum[1]=low[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i])mu[i]=-1,prim[++cnt]=i,low[i]=i,sum[i]=(1-i+mod)%mod;
		for(int j=1;j<=cnt&&i*prim[j]<=n;j++){
			vis[i*prim[j]]=1;
			if(i%prim[j]==0){
				low[i*prim[j]]=low[i]*prim[j];
				if(low[i]==i)sum[i*prim[j]]=sum[i];
				else sum[i*prim[j]]=sum[i/low[i]]*sum[prim[j]*low[i]]%mod;
				break;
			}else{
				low[i*prim[j]]=prim[j];
				sum[i*prim[j]]=sum[i]*sum[prim[j]]%mod;
				mu[i*prim[j]]=-mu[i];
			}
		}
	}
	for(int T=1;T<=n;T++)sum[T]=(T*sum[T]%mod+sum[T-1])%mod;
}
int ask(int x,int y){return (x+y)*(y-x+1)/2%mod;}
int query(int n,int m){
	int re=0;
	int mx=min(n,m);
	for(int l=1,r;l<=mx;l=r+1){
		r=min(n/(n/l),m/(m/l));
		int tmp=ask(1,n/l)*ask(1,m/l)%mod;
		tmp=tmp*(sum[r]-sum[l-1]+mod)%mod;
		re=(re+tmp)%mod;
	}
	return re;
}
int t;
signed main(){
	pre(10000000);
	int n,m;
	scanf("%lld%lld",&n,&m);
	printf("%lld\n",query(n,m));
	return 0;
}
posted @ 2019-03-16 18:06  The_KOG  阅读(309)  评论(2编辑  收藏  举报