标签:nbsp ons 否则 use ret 决定 problem bre mes
复习
/************************************************************** Problem: 1101 User: lxy8584099 Language: C++ Result: Accepted Time:6736 ms Memory:1456 kb ****************************************************************/ /* 莫比乌斯反演 + 整除分块 sigma ( mu(k)*(n/d/k)*(m/d/k) ) mu(i) 由i的质因子决定 由俩及以上相同质因子 mu=0 否则 mu=(-1)^质因子个数 */ #include<cstdio> using namespace std; const int N=5e4+50; int pri[N],mu[N],s[N]; bool vis[N]; int min(int a,int b) {return a>b?b:a;} void pre() { mu[1]=1;for(int i=2;i<=50000;i++) { if(!vis[i]) pri[++pri[0]]=i,mu[i]=-1; for(int j=1;j<=pri[0];j++) { if(i*pri[j]>50000) break; vis[i*pri[j]]=1;mu[i*pri[j]]=-mu[i]; if(i%pri[j]==0) {mu[i*pri[j]]=0;break;} } } for(int i=2;i<=50000;i++) mu[i]+=mu[i-1]; } int main() { pre(); int T;scanf("%d",&T);while(T--) { int n,m,d,L=1,R;long long res=0; scanf("%d%d%d",&n,&m,&d); n/=d;m/=d;if(n>m) n^=m^=n^=m; for(;L<=n;L=R+1) { R=min(n/(n/L),m/(m/L)); res+=1LL*(mu[R]-mu[L-1])*(n/L)*(m/L); } printf("%lld\n",res); } return 0; }
标签:nbsp ons 否则 use ret 决定 problem bre mes
原文地址:https://www.cnblogs.com/lxy8584099/p/10327410.html