[BZOJ 3309]DZY Loves Math 莫比乌斯反演
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ 3309]DZY Loves Math 莫比乌斯反演相关的知识,希望对你有一定的参考价值。
还是需要看题解T-T
枚举d=gcd(i,j),得到
好了现在就要处理后边这个函数了,可以无脑求,不过107显然会T,当然要O(n)了
然后我们就观察这个函数。。大力分析一下µ可能会带来的贡献
令T=p1a1*p2a2*...*pkak
d=p1b1*p2b2*...*pkbk
若μ(T/d)!=0,那么T/d后各项次数0<=(ai-bi)<=1
分一下类:
①若ai!=aj
我们知道对于f(d)有贡献的是最大次项,设为ax
假如固定d包含约数pax,那么f(d)=ax,T的所有约数d的其他次幂就要选择了。
根据组合数的性质,选择奇数和偶数的方案是一样的,而它对答案f(d)的系数的贡献分别为±1,这样一综合为0
②若所有的a都相等
我们假设对于任意选取方案,f值都不变
那么由于选取奇数个元素和偶数个元素的方案数相等,和仍然为0
但是有一种选取方案,那就是全部选,它的f值就变为了a-1,因为它的最高次幂不是a了
但是它对应的方案选取的f值还是a,所以一综合,我们就要处理掉这个差出来的1
考虑到μ的符号之后,最终结果为(-1)(k+1)
最终结果:故所有a都相等,则g(T)=(-1)(k+1)
然后根据lc大神教的O(n)思路去处理就好啦!记得开long long
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define N 10100000 #define pos(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; #define LL long long int t,n,m; int notprime[N],prime[N]; LL g[N],K[N],G[N]; void get_pre(){ notprime[1]=1; pos(i,2,N-10){ if(!notprime[i]){ prime[++prime[0]]=i; g[i]=1;K[i]=1;G[i]=i; } for(int j=1;j<=prime[0]&&prime[j]*i<=N-10;j++){ notprime[i*prime[j]]=1; if(i%prime[j]==0){ K[i*prime[j]]=K[i]+1; G[i*prime[j]]=G[i]*prime[j]; int i1=i*prime[j]/G[i*prime[j]]; if(i1==1) g[i*prime[j]]=1; else{ if(K[i1]==K[i*prime[j]]) g[i*prime[j]]=-g[i1]; else g[i*prime[j]]=0; } break; } G[i*prime[j]]=prime[j]; K[i*prime[j]]=1; if(K[i]==1) g[i*prime[j]]=-g[i]; else g[i*prime[j]]=0; } } pos(i,1,N-10) g[i]+=g[i-1]; } LL get_ans(){ if(n>m) swap(n,m); LL res(0); int last(0); for(int i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); res+=(n/i)*1ll*(m/i)*1ll*(g[last]-g[i-1]); } return res; } int main(){ scanf("%d",&t); get_pre(); while(t--){ scanf("%d%d",&n,&m); printf("%lld\\n",get_ans()); } return 0; }
以上是关于[BZOJ 3309]DZY Loves Math 莫比乌斯反演的主要内容,如果未能解决你的问题,请参考以下文章