与莫比乌斯反演没什么关系的莫比乌斯函数题

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 }
View Code

 

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 }
View Code

 

以上是关于与莫比乌斯反演没什么关系的莫比乌斯函数题的主要内容,如果未能解决你的问题,请参考以下文章

莫比乌斯函数与莫比乌斯反演

莫比乌斯反演的莫比乌斯反演的性质

莫比乌斯函数与莫比乌斯反演

数论函数与莫比乌斯反演

莫比乌斯反演

莫比乌斯反演