BZOJ传送门
洛谷传送门
解析:
数学题就不废话了,我们要求的是这个式子: ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^mlcm(i,j) i=1∑nj=1∑mlcm(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=1∑nj=1∑mgcd(i,j)i×jd=1∑min(n,m)i=1∑nj=1∑mdi×j[gcd(i,j)=d]d=1∑min(n,m)di=1∑⌊dn⌋j=1∑⌊dm⌋ij[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=1⌊dn⌋∑j=1⌊dm⌋ij可以用分配率拆开,可以 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=1∑min(n,m)d⋅S(⌊dn⌋)S(⌊dm⌋)t∣gcd(i,j),i≤⌊dn⌋,j≤⌊dm⌋∑μ(t)d=1∑min(n,m)d⋅t=1∑⌊dmin(n,m)⌋t2μ(t)⋅S(⌊dtn⌋)S(⌊dtm⌋)T=1∑min(n,m)S(⌊Tn⌋)S(⌊Tm⌋)Td∣T∑dμ(d)
前面的已经可以O(1)求了,后面的这个东西看上去不是很好办: T ∑ d ∣ T d μ ( d ) T\sum_{d\mid T}d\mu(d) T∑d∣Tdμ(d)
令 F ( T ) = ∑ d ∣ T d μ ( d ) F(T)=\sum_{d\mid T}d\mu(d) F(T)=∑d∣Tdμ(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 p∈P,F(p)=1−p
对于 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(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) p∈P,a∈N∗,p∣a,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;
}