bzoj 1101 Zap —— 莫比乌斯反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101
直接莫比乌斯反演。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int const xn=5e5+5; int pri[xn],cnt,mu[xn]; bool vis[xn]; int rd() { int ret=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar(); return f?ret:-ret; } void init() { int mx=5e5; mu[1]=1; for(int i=2;i<=mx;i++) { if(!vis[i])pri[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt&&(ll)i*pri[j]<=mx;j++) { vis[i*pri[j]]=1; if(i%pri[j])mu[i*pri[j]]=-mu[i]; else break; } } for(int i=2;i<=mx;i++)mu[i]+=mu[i-1]; } int main() { int T=rd(); init(); while(T--) { int n=rd(),m=rd(),d=rd(); n/=d; m/=d; if(n>m)swap(n,m); ll ans=0; for(int i=1,j;i<=n;i=j+1) j=min(n/(n/i),m/(m/i)),ans+=(ll)(mu[j]-mu[i-1])*(n/i)*(m/i); printf("%lld\n",ans); } return 0; }