2019.01.20【BZOJ2154】【洛谷P1829】Crash的数字表格(莫比乌斯反演)

BZOJ传送门

洛谷传送门


解析:

数学题就不废话了,我们要求的是这个式子: ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^mlcm(i,j) i=1nj=1mlcm(i,j)

还是转化成 g c d gcd gcd,一波常规操作: A n s = ∑ i = 1 n ∑ j = 1 m i × j g c d ( i , j ) = ∑ d = 1 min ⁡ ( n , m ) ∑ i = 1 n ∑ j = 1 m i × j d [ g c d ( i , j ) = d ] = ∑ d = 1 min ⁡ ( n , m ) d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j [ g c d ( i , j ) = 1 ] \begin{aligned} Ans=&\sum_{i=1}^n\sum_{j=1}^m\frac{i\times j}{gcd(i,j)}\\ =&\sum_{d=1}^{\min(n,m)}\sum_{i=1}^n\sum_{j=1}^m\frac{i\times j}d[gcd(i,j)=d]\\ =&\sum_{d=1}^{\min(n,m)}d\sum_{i=1}^{\lfloor\frac{n}d\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij[gcd(i,j)=1] \end{aligned} Ans===i=1nj=1mgcd(i,j)i×jd=1min(n,m)i=1nj=1mdi×j[gcd(i,j)=d]d=1min(n,m)di=1dnj=1dmij[gcd(i,j)=1]

好了,有这种东西就可以上 e e e的反演了,而且上面这个东西: ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j \sum_{i=1}^{\lfloor\frac{n}d\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij i=1dnj=1dmij可以用分配率拆开,可以 O ( 1 ) O(1) O(1)算出。

为了方便,定义函数 S ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 S(n)=\sum_{i=1}^ni=\frac{n(n+1)}{2} S(n)=i=1ni=2n(n+1)

继续推式子:

A n s = ∑ d = 1 min ⁡ ( n , m ) d ⋅ S ( ⌊ n d ⌋ ) S ( ⌊ m d ⌋ ) ∑ t ∣ g c d ( i , j ) , i ≤ ⌊ n d ⌋ , j ≤ ⌊ m d ⌋ μ ( t ) = ∑ d = 1 min ⁡ ( n , m ) d ⋅ ∑ t = 1 ⌊ min ⁡ ( n , m ) d ⌋ t 2 μ ( t ) ⋅ S ( ⌊ n d t ⌋ ) S ( ⌊ m d t ⌋ ) = ∑ T = 1 min ⁡ ( n , m ) S ( ⌊ n T ⌋ ) S ( ⌊ m T ⌋ ) T ∑ d ∣ T d μ ( d ) \begin{aligned} Ans=&\sum_{d=1}^{\min(n,m)}d\cdot S(\lfloor\frac{n}d\rfloor)S(\lfloor\frac{m}d\rfloor)\sum_{t \mid gcd(i,j),i\leq \lfloor\frac{n}d\rfloor,j\leq \lfloor\frac{m}d\rfloor}\mu(t)\\ =&\sum_{d=1}^{\min(n,m)}d \cdot \sum_{t=1}^{\lfloor\frac{\min(n,m)}{d}\rfloor}t^2\mu(t)\cdot S(\lfloor\frac{n}{dt}\rfloor)S(\lfloor\frac{m}{dt}\rfloor)\\ =&\sum_{T=1}^{\min(n,m)}S(\lfloor\frac{n}T\rfloor)S(\lfloor\frac{m}T\rfloor)T\sum_{d\mid T}d\mu(d) \end{aligned} Ans===d=1min(n,m)dS(dn)S(dm)tgcd(i,j),idn,jdmμ(t)d=1min(n,m)dt=1dmin(n,m)t2μ(t)S(dtn)S(dtm)T=1min(n,m)S(Tn)S(Tm)TdTdμ(d)

前面的已经可以O(1)求了,后面的这个东西看上去不是很好办: T ∑ d ∣ T d μ ( d ) T\sum_{d\mid T}d\mu(d) TdTdμ(d)

F ( T ) = ∑ d ∣ T d μ ( d ) F(T)=\sum_{d\mid T}d\mu(d) F(T)=dTdμ(d)

其实 F F F可以在线性筛的时候一起处理出来。

首先 F ( 1 ) = 1 F(1)=1 F(1)=1

对于 p ∈ P , F ( p ) = 1 − p p\in\mathbb P,F(p)=1-p pP,F(p)=1p

对于 p ∈ P , a ∈ N ∗ , p ∤ a , F ( a p ) = F ( a ) F ( p ) p\in\mathbb P,a\in \mathbb N_*,p\nmid a,F(ap)=F(a)F(p) pP,aN,pa,F(ap)=F(a)F(p)

对于 p ∈ P , a ∈ N ∗ , p ∣ a , F ( a p ) = F ( a ) p\in \mathbb P,a\in \mathbb N_*,p\mid a,F(ap)=F(a) pP,aN,pa,F(ap)=F(a)

这个通过新增一个质因子会产生的新的因子的贡献就可以看出了。

其实 F F F就是一个积性函数,这里就不证了。通过构造 F ( a b ) F(ab) F(ab) F ( a ) × F ( b ) F(a)\times F(b) F(a)×F(b)的每一项的一一对应就行了。


代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc get_char
#define pc put_char
#define cs const

cs int P=10000007;
cs ll mod=20101009,inv2=mod-mod/2;
bool mark[P];
int prime[P],pcnt,F[P];

inline void linear_sieves(int len=P-7){
	F[1]=1;
	for(int re i=2;i<=len;++i){
		if(!mark[i])prime[++pcnt]=i,F[i]=1-i;
		for(int re j=1;i*prime[j]<=len;++j){
			mark[i*prime[j]]=true;
			if(i%prime[j]==0){F[i*prime[j]]=F[i];break;}
			F[i*prime[j]]=F[i]*(1-prime[j]);
		}
		F[i]=((ll)i*F[i]%mod+F[i-1]+mod)%mod;
	}
}

inline ll S(cs ll m){
	return m*(m+1)%mod*inv2%mod;
}

int n,m;
ll ans;
signed main(){
	scanf("%d%d",&n,&m);
	if(n>m)swap(n,m);
	linear_sieves(n);
	for(int re i=1,j;i<=n;i=j+1){
		j=min(n/(n/i),m/(m/i));
		ans=(ans+S(n/i)*S(m/i)%mod*(F[j]-F[i-1]+mod)%mod)%mod;
	}
	cout<<ans;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值