莫比乌斯反演
PoPoQQQ的讲义例一的一半……好吧这题是那题的基础部分= =很水……
WA了一次:因为没强制类型转换LL
1 //BZOJ 1101 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #define rep(i,n) for(int i=0;i<n;++i) 8 #define F(i,j,n) for(int i=j;i<=n;++i) 9 #define D(i,j,n) for(int i=j;i>=n;--i) 10 using namespace std; 11 12 int getint(){ 13 int v=0,sign=1; char ch=getchar(); 14 while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();} 15 while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();} 16 return v*=sign; 17 } 18 /*******************tamplate********************/ 19 const int N=50010; 20 typedef long long LL; 21 int prime[N],mu[N],sum[N]; 22 bool check[N]; 23 void getmu(){ 24 mu[1]=1; 25 int tot=0; 26 for(int i=2;i<N;++i){ 27 if (!check[i]){ 28 prime[tot++]=i; 29 mu[i]=-1; 30 } 31 rep(j,tot){ 32 if (i*prime[j]>N) break; 33 check[i*prime[j]]=1; 34 if (i%prime[j]) 35 mu[i*prime[j]]=-mu[i]; 36 else{ 37 mu[i*prime[j]]=0; 38 break; 39 } 40 } 41 } 42 F(i,1,N-1) sum[i]=sum[i-1]+mu[i]; 43 } 44 LL calc(int m,int n,int k){ 45 int i,last; 46 LL re=0; 47 n/=k; m/=k; 48 for(i=1;i<=m && i<=n;i=last+1){ 49 last=min(n/(n/i),m/(m/i)); 50 re+=(sum[last]-sum[i-1])*(m/i)*(n/i); 51 } 52 return re; 53 } 54 int main(){ 55 int n=getint(),a,b,d; 56 getmu(); 57 F(i,1,n){ 58 a=getint(); b=getint(); d=getint(); 59 printf("%lld\n",calc(a,b,d)); 60 } 61 return 0; 62 }
时间: 2024-10-15 08:26:32