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

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

 

posted @ 2019-03-30 09:55  jack_yyc  阅读(154)  评论(0编辑  收藏  举报