2301: [HAOI2011]Problem b|莫比烏斯反演
阿新 • • 發佈:2019-01-23
第三次學莫比烏斯反演
別問我為什麼(前兩次,卒)
莫比烏斯反演其實就是一個類似容斥原理的東西
好像扯遠了
題解:參見PoPoQQQ大爺 http://blog.csdn.net/PoPoQQQ/article/details/41957687
講得很好,對了他還有一個課件,不會反演的可以去百度搜一下- -
#include<set> #include<map> #include<ctime> #include<queue> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define T 50005 using namespace std; int sc() { int i=0; char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i; } int prime[T],a[T]; long long mu[T]; int top; void Pretreatment() { for(int i=2;i<T;i++) { if(!a[i]) { prime[++top]=i; mu[i]=-1; } for(int j=1;j<=top&&i*prime[j]<T;j++) { a[i*prime[j]]=1; if(i%prime[j]==0) break; mu[i*prime[j]]=-mu[i]; } } mu[1]=1; for(int i=1;i<T;i++) mu[i]+=mu[i-1]; } long long cal(int n,int m,int k) { long long ans=0; n/=k,m/=k; for(int i=1,last;i<=m&&i<=n;i=last+1) { last=min(n/(n/i),m/(m/i)); ans+=(mu[last]-mu[i-1])*(n/i)*(m/i); } return ans; } int main() { Pretreatment(); for(int n=sc();n;n--) { int a=sc(),b=sc(),c=sc(),d=sc(),k=sc(); printf("%lld\n",cal(b,d,k)-cal(b,c-1,k)-cal(a-1,d,k)+cal(a-1,c-1,k)); } return 0; }