与莫比乌斯反演没什么关系的莫比乌斯函数题
Posted yyc-jack-0920
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与莫比乌斯反演没什么关系的莫比乌斯函数题相关的知识,希望对你有一定的参考价值。
Codeforces 1139D. Steps to One
题目大意:
给出$m$,一个空的数列,每次可以$rand$一个数$x\in[1,m]$放到数列的末尾,若整个数列的$gcd==1$则停止加入数 求数列的期望长度
思路:
考虑当前整个数列的$gcd$为质数$p$的倍数,则若下一个数还是$p$的倍数即$\sum\limits_{i=1}^m [gcd(i,p)==p]$,相当于没变
则设当前$gcd$对答案产生的贡献为$ans_x$得到:$ans_x=1+ \sum\limits_{i=0}^m [gcd(i,p)==p] * ans_x =1+\frac{m}{p} *ans_x$
这样会重复计算,我们用莫比乌斯函数容斥,然后移项即可
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #define ll long long 12 #define db double 13 #define inf 2139062143 14 #define MAXN 100100 15 #define MOD 1000000007 16 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i) 17 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i) 18 #define ren for(register int i=fst[x];i;i=nxt[i]) 19 #define pb(i,x) vec[i].push_back(x) 20 #define pls(a,b) (a+b+MOD)%MOD 21 #define mns(a,b) (a-b+MOD)%MOD 22 #define mul(a,b) (1LL*(a)*(b))%MOD 23 using namespace std; 24 inline int read() 25 { 26 int x=0,f=1;char ch=getchar(); 27 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 28 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 29 return x*f; 30 } 31 int n,tot,p[MAXN],ntp[MAXN],lmt,mu[MAXN]; 32 int q_pow(int bas,int t,int res=1) 33 { 34 for(;t;t>>=1,bas=mul(bas,bas)) 35 if(t&1) res=mul(res,bas);return res; 36 } 37 void mem(int n) 38 { 39 mu[1]=1;rep(i,2,n) 40 { 41 if(!ntp[i]) p[++tot]=i,mu[i]=-1; 42 rep(j,1,tot) if(i*p[j]>n) break; 43 else {ntp[i*p[j]]=1;if(i%p[j]) mu[i*p[j]]=-mu[i];else {mu[i*p[j]]=0;break;}} 44 } 45 } 46 int main() 47 { 48 n=read();mem(100000);int ans=1; 49 rep(i,2,n) ans=mns(ans,mu[i]*mul((n/i),q_pow(n-n/i,MOD-2))); 50 printf("%d\n",ans); 51 }
bzoj 2440 完全平方数
题目大意:
求第$k$个不包含平方因子的数
思路:
二分答案$x$,之后用莫比乌斯函数容斥只有一个因子为完全平方数,两个因子为完全平方数的这些数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #define ll long long 12 #define db double 13 #define inf 21474836460 14 #define MAXN 100100 15 #define MOD 1000000007 16 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i) 17 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i) 18 #define ren for(register int i=fst[x];i;i=nxt[i]) 19 #define pb(i,x) vec[i].push_back(x) 20 #define pls(a,b) (a+b+MOD)%MOD 21 #define mns(a,b) (a-b+MOD)%MOD 22 #define mul(a,b) (1LL*(a)*(b))%MOD 23 using namespace std; 24 inline int read() 25 { 26 int x=0,f=1;char ch=getchar(); 27 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 28 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 29 return x*f; 30 } 31 ll n;int tot,p[MAXN],ntp[MAXN],lmt,mu[MAXN]; 32 void mem(int n) 33 { 34 mu[1]=1;rep(i,2,n) 35 { 36 if(!ntp[i]) p[++tot]=i,mu[i]=-1; 37 rep(j,1,tot) if(i*p[j]>n) break; 38 else {ntp[i*p[j]]=1;if(i%p[j]) mu[i*p[j]]=-mu[i];else {mu[i*p[j]]=0;break;}} 39 } 40 } 41 int cheq(int x,ll res=0){rep(i,1,sqrt(x)) res+=1LL*mu[i]*(x/(i*i));return res>=n;} 42 int main() 43 { 44 int T=read();ll l,r,mid,ans;mem(100000);while(T--) 45 { 46 n=read();for(l=1,ans=r=inf;mid=l+r>>1,l<=r;) 47 if(cheq(mid)) ans=mid,r=mid-1;else l=mid+1; 48 printf("%d\n",ans); 49 } 50 }
以上是关于与莫比乌斯反演没什么关系的莫比乌斯函数题的主要内容,如果未能解决你的问题,请参考以下文章