莫比乌斯反演
PoPoQQQ讲义第二题。
暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了……
为什么去掉了一个memset就不T了→_→……
1 /************************************************************** 2 Problem: 2820 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:4368 ms 7 Memory:167304 kb 8 ****************************************************************/ 9 10 //BZOJ 2820 11 #include<cstdio> 12 #include<cstdlib> 13 #include<cstring> 14 #include<iostream> 15 #include<algorithm> 16 #define rep(i,n) for(int i=0;i<n;++i) 17 #define F(i,j,n) for(int i=j;i<=n;++i) 18 #define D(i,j,n) for(int i=j;i>=n;--i) 19 using namespace std; 20 21 int getint(){ 22 int v=0,sign=1; char ch=getchar(); 23 while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();} 24 while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();} 25 return v*=sign; 26 } 27 /*******************tamplate********************/ 28 const int N=10001000; 29 typedef long long LL; 30 int mu[N],prime[N],g[N],sum[N]; 31 bool check[N]; 32 33 void getmu(){ 34 int tot=0; 35 mu[1]=1; 36 for(int i=2;i<N;i++){ 37 if (!check[i]){ 38 prime[tot++]=i; 39 mu[i]=-1; 40 } 41 rep(j,tot){ 42 if(i*prime[j]>=N)break; 43 check[i*prime[j]]=1; 44 if(i%prime[j]==0){ 45 mu[i*prime[j]]=0; 46 break; 47 } 48 else 49 mu[i*prime[j]]=-mu[i]; 50 } 51 } 52 rep(j,tot) 53 for(int i=prime[j];i<N;i+=prime[j]) 54 sum[i]+=mu[i/prime[j]];//对于每个质数,枚举它的倍数 55 for(int i=1;i<N;i++) sum[i]+=sum[i-1]; 56 } 57 58 int main(){ 59 getmu(); 60 int T=getint(); 61 LL ans; 62 while(T--){ 63 int n=getint(),m=getint(); 64 if(n>m) swap(n,m); 65 ans=0; 66 for(int i=1,last;i<=n;i=last+1){ 67 last=min(n/(n/i),m/(m/i)); 68 ans+=(LL)(n/i)*(m/i)*(sum[last]-sum[i-1]); 69 } 70 printf("%lld\n",ans); 71 } 72 return 0; 73 } 74
时间: 2024-10-16 17:50:22