与莫比乌斯反演没什么关系的莫比乌斯函数题
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 }