时间限制: 1000 ms 空间限制: 262144 KB
题目描述
输入N个数,从中选择一些出来计算出总和,问有多少种选法使得和为质数。
输入
第一行一个整数N。
第二行N个整数,表示这N个数的值。
输出
一个整数,表示方案数。
样例输入
样例输出
数据范围限制
提示
【样例解释】
一共有12种选法:(1,1,2,7),(1,2,7),(2,7),(1,1,7),(1,7),(7),(1,1,2),(1,2),(2),(1,1),(1)和(),其中(1,1,2,7),(7),(1,2),(1,1),(2)为5种正确选法。
【限制】
1<=N<=50。
每个数不超过10,000。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include<bits/stdc++.h> using namespace std; struct s { long long b; int g; }a[100]; bool cmd(s x,s y) { return x.b<x.b; } bool zs[600000],sf[10001]; long long n,all,x,ans,maxn,f[510000]; void zhishu() { for(int i=2;i<=600000;i++) { if(zs[i]==0) { int l=2; while(i*l<=600000) { zs[i*l]=1; l++; } } } zs[1]=1; zs[0]=1; } int main() { zhishu(); cin>>n; for(int i=1;i<=n;i++) { cin>>x; if(sf[x]==0) { a[++all].g=1; a[all].b=x; sf[x]=1; } else for(int j=1;j<=all;j++) if(a[j].b==x) a[j].g++; } f[0]=1; sort(a+1,a+1+all,cmd); for(int i=1;i<=all;i++) { for(int j=maxn;j>=0;j--) { for(int k=1;k<=a[i].g;k++) { f[j+a[i].b*k]+=f[j]; } } maxn+=a[i].b*a[i].g; } for(int i=1;i<=maxn;i++) { if(zs[i]==0) ans+=f[i]; } cout<<ans; return 0; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系