题目大意
∑ni=1∑mj=1μ2((i,j))
反演
∑ni=1μ(i)∗∑n/id=1μ2(d)∗(n/id)∗(m/id)
设
T=di
∑nT=1(n/T)∗(m/T)∗∑di=Tμ2(d)∗μ(i)
注意到如果T存在一个质因数次数>2,那么后面这条式子一定为0。
如果T存在一个质因数次数=1,那么不考虑这个质因数其余部分一正一负恰好抵消,因此后面这条式子也为0。
因此发现合法的T必须是完全平方数,式子可以改写。
∑ni=1μ(i)∗(n/i/i)∗(m/i/i)
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=10000000+10,mo=998244353;
int pri[maxn],mu[maxn];
bool bz[maxn];
ll i,j,k,l,t,top,ans;
ll n,m;
int main(){
mu[1]=1;
fo(i,2,maxn-10){
if (!bz[i]) pri[++top]=i,mu[i]=-1;
fo(j,1,top){
if ((ll)i*pri[j]>maxn-10) break;
bz[i*pri[j]]=1;
if (i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
scanf("%lld%lld",&n,&m);
if (n>m) swap(n,m);
t=sqrt(n);
fo(i,1,t) (ans+=(ll)mu[i]*((n/i/i)%mo)%mo*((m/i/i)%mo)%mo)%=mo;
(ans+=mo)%=mo;
printf("%d\n",ans);
}