您的位置:首页 > 产品设计 > UI/UE

F. Coprime Subsequences

2017-05-14 17:18 447 查看
题目链接:

F.CoprimeSubsequences

timelimitpertest
2seconds

memorylimitpertest
256megabytes

input
standardinput

output
standardoutput

Let'scallanon-emptysequenceofpositiveintegersa1, a2...akcoprimeifthegreatestcommondivisorofallelementsofthissequenceisequalto1.

Givenanarrayaconsistingofnpositiveintegers,findthenumberofitscoprimesubsequences.Sincetheanswermaybeverylarge,printitmodulo109 + 7.

Notethattwosubsequencesareconsidereddifferentifchosenindicesaredifferent.Forexample,inthearray[1, 1]thereare3differentsubsequences:[1],[1]and[1, 1].

Input
Thefirstlinecontainsoneintegernumbern(1 ≤ n ≤ 100000).

Thesecondlinecontainsnintegernumbersa1, a2...an(1 ≤ ai ≤ 100000).

Output
Printthenumberofcoprimesubsequencesofamodulo109 + 7.

Examples

input
3
123


output
5


input
4
1111


output
15


input
7
13515310535


output
100

题意:给一个序列,问gcd为1的子序列有多少个;

思路:容斥,可以求出gcd为1的倍数的子序列个数,然后减去gcd为2,3,5,等等一个素数倍数的子序列个数再加上两个素数积倍数的子序列个数以此类推,
(注意容斥里面集合的交集里面不可能有4,9,12这种数,因为质因数分解后里面同一个质因数的个数>1,这就不可能在两个集合的交集里面);

AC代码:


#include<bits/stdc++.h> usingnamespacestd; typedeflonglongLL; constintmaxn=1e5+10; constintmod=1e9+7; intn,a[maxn],p[maxn]; intvis[maxn],num[maxn]; voidinit() { p[0]=1; for(inti=1;i<maxn;i++){p[i]=p[i-1]*2;if(p[i]>=mod)p[i]-=mod;} for(inti=2;i<maxn;i++) { if(!vis[i]) { num[i]++; for(intj=2*i;j<maxn;j+=i) { vis[j]=1; if(num[j]==-1)continue; inttep=j,x=0; while(tep%i==0)x++,tep/=i; if(x>1)num[j]=-1; elsenum[j]++; } } } } intmain() { init(); scanf("%d",&n); intx; for(inti=1;i<=n;i++) { scanf("%d",&x); for(intj=1;j*j<=x;j++) { if(x%j)continue; a[j]++; if(j*j!=x)a[x/j]++; } } intans=0; for(inti=1;i<maxn;i++) { if(num[i]==-1)continue; if(num[i]&1)ans=(ans-p[a[i]]+1); elseans=(ans+p[a[i]]-1); if(ans>=mod)ans-=mod; elseif(ans<0)ans+=mod; } printf("%d\n",ans); return0; }

  


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: