正题
题目链接:https://www.luogu.com.cn/problem/P1829
题目大意
给出n,mn,mn,m求∑i=1n∑j=1mlcm(i,j)\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)i=1∑nj=1∑mlcm(i,j)
解题思路
∑i=1n∑j=1mijgcd(i,j)\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}i=1∑nj=1∑mgcd(i,j)ij
∑x=1nx×(∑i=1⌊nx⌋∑j=1⌊mx⌋ij×[gcd(i,j)==1])\sum_{x=1}^nx\times (\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}ij\times [gcd(i,j)==1])x=1∑nx×(i=1∑⌊xn⌋j=1∑⌊xm⌋ij×[gcd(i,j)==1])
∑x=1nx×∑x∣dμ(dx)d2∗∑i=1⌊nx⌋∑j=1⌊mx⌋ij\sum_{x=1}^nx\times \sum_{x|d}\mu(\frac{d}{x})d^2*\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}ijx=1∑nx×x∣d∑μ(xd)d2∗i=1∑⌊xn⌋j=1∑⌊xm⌋ij
单独拎出后面的来看
∑x∣dμ(dx)d2∗∑i=1⌊nx⌋∑j=1⌊mx⌋ij\sum_{x|d}\mu(\frac{d}{x})d^2*\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}ijx∣d∑μ(xd)d2∗i=1∑⌊xn⌋j=1∑⌊xm⌋ij
∑x∣dμ(dx)d2∗∑i=1⌊nd⌋i∗∑j=1⌊md⌋j\sum_{x|d}\mu(\frac{d}{x})d^2*\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}i*\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}jx∣d∑μ(xd)d2∗i=1∑⌊dn⌋i∗j=1∑⌊dm⌋j
然后整除分块处理这一个
之后再在外面套一个整除分块即可。
时间复杂度O(n+m)O(n+m)O(n+m)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e7+10,XJQ=20101009;
ll n,m,mu[N],pri[N],g[N],cnt,ans;
bool v[N];
void ycl(ll n){mu[1]=1;for(ll i=2;i<=n;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}for(ll i=1;i<=n;i++)mu[i]=(mu[i-1]+mu[i]*i*i%XJQ)%XJQ;return;
}
ll solve(ll n,ll m){ll ans=0;for(ll l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ll q=n/l,p=m/l;ans=(ans+(q*(q+1)/2%XJQ)*(p*(p+1)/2%XJQ)%XJQ*(mu[r]-mu[l-1]+XJQ)%XJQ)%XJQ;}return ans;
}
int main()
{scanf("%lld%lld",&n,&m);if(n>m)swap(n,m);ycl(m);for(ll l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));(ans+=(r+l)*(r-l+1)/2%XJQ*solve(n/l,m/l)%XJQ)%=XJQ;}printf("%lld\n",ans);
}