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

版权声明:转载请声明出处,谢谢配合。 https://blog.csdn.net/zxyoi_dreamer/article/details/86563299

BZOJ传送门

洛谷传送门


解析:

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

还是转化成 g c d 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}

好了,有这种东西就可以上 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 可以用分配率拆开,可以 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}

继续推式子:

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}

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

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

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

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

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

扫描二维码关注公众号,回复: 5011350 查看本文章

对于 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)

对于 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)

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

其实 F F 就是一个积性函数,这里就不证了。通过构造 F ( a b ) F(ab) F ( a ) × F ( b ) F(a)\times 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;
}

猜你喜欢

转载自blog.csdn.net/zxyoi_dreamer/article/details/86563299