CodeForces 803 F.Coprime Subsequences(莫比乌斯反演+组合数学)
2018-01-14 19:31
453 查看
Description
给出一长度为n的序列ai,问该序列的子序列中有多少子序列的gcd是1
Input
第一行输入一整数n表示序列长度,之后输入n个整数ai表示该序列(1≤n,ai≤105)
Output
输出a序列的gcd为1的子序列,结果模109+7
Sample Input
3
1 2 3
Sample Output
5
Solution
用f(d)表示a子序列中gcd为d的个数,F(d)表示a子序列中gcd被d整除的个数
统计a1,a2,...,an中可以被d整除的数的个数num(d),则F(d)=2num(d)−1
显然F(d)=∑d|nf(n),由莫比乌斯反演,f(d)=∑d|nμ(nd)F(n)
而要求的答案即为f(1)=∑i=1mμ(i)F(i),其中m=max(a1,a2,...,an)
Code
给出一长度为n的序列ai,问该序列的子序列中有多少子序列的gcd是1
Input
第一行输入一整数n表示序列长度,之后输入n个整数ai表示该序列(1≤n,ai≤105)
Output
输出a序列的gcd为1的子序列,结果模109+7
Sample Input
3
1 2 3
Sample Output
5
Solution
用f(d)表示a子序列中gcd为d的个数,F(d)表示a子序列中gcd被d整除的个数
统计a1,a2,...,an中可以被d整除的数的个数num(d),则F(d)=2num(d)−1
显然F(d)=∑d|nf(n),由莫比乌斯反演,f(d)=∑d|nμ(nd)F(n)
而要求的答案即为f(1)=∑i=1mμ(i)F(i),其中m=max(a1,a2,...,an)
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; typedef pair<int,int>P; const int INF=0x3f3f3f3f,maxn=100005; #define mod 1000000007 int phi[maxn],mu[maxn],p[maxn],f[maxn],n,num[maxn]; void init(int n=1e5) { mu[1]=1; int res=0; for(int i=2;i<=n;i++) { if(!phi[i])phi[i]=i-1,mu[i]=-1,p[res++]=i; for(int j=0;j<res&&i*p[j]<=n;j++) { if(i%p[j]) { phi[i*p[j]]=(p[j]-1)*phi[i]; mu[i*p[j]]=-mu[i]; } else { phi[i*p[j]]=p[j]*phi[i]; mu[i*p[j]]=0; break; } } } f[0]=1; for(int i=1;i<=n;i++)f[i]=2*f[i-1]%mod; } void add(int &x,int y) { x=x+y>=mod?x+y-mod:x+y; } int main() { init(); scanf("%d",&n); int m=0; for(int i=1;i<=n;i++) { int temp; scanf("%d",&temp); m=max(m,temp); num[temp]++; } for(int i=1;i<=m;i++) for(int j=2*i;j<=m;j+=i) num[i]+=num[j]; int ans=0; for(int i=1;i<=m;i++) if(mu[i]==1)add(ans,f[num[i]]-1); else if(mu[i]==-1)add(ans,mod-(f[num[i]]-1)); printf("%d\n",ans); return 0; }
相关文章推荐
- 【codeforces 803F】Coprime Subsequences
- Codeforces-803F-Coprime Subsequences(筛)
- CF 803 F Coprime Subsequences (容斥原理)
- CF 803 F. Coprime Subsequences(数论题,莫比乌斯,容斥原理)
- 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演
- Educational Codeforces Round 20 F. Coprime Subsequences(容斥)
- [cf803F] Coprime Subsequences(组合数学,容斥)
- hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)
- cf Educational Codeforces Round 20 F. Coprime Subsequences
- 「Codeforces 915G」Coprime Arrays
- F. Coprime Subsequences
- [CodeForces803F]Coprime Subsequences
- Educational Codeforces Round 20 F. Coprime Subsequences(莫比乌斯反演)
- LA 7048 Coprime 莫比乌斯反演
- codeforces 680C C. Bear and Prime 100(数论)
- hdu 5072 coprime不完整题解
- HDU4135 Co-prime【容斥原理】3方法
- CodeForces-660A-Co-prime Array
- 【容斥原理】HDU 4135 Co-prime
- HDU 5072 Coprime(数论+容斥原理)