华师一附中OI组
标题:
P1036 选数
[打印本页]
作者:
admin
时间:
2018-5-11 10:49
标题:
P1036 选数
https://www.luogu.org/problemnew/show/P1036
题目描述
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。
输入输出格式
输入格式:
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
输入输出样例
输入样例#1:
4 3
3 7 12 19
输出样例#1:
1
作者:
吴语林
时间:
2018-5-12 11:37
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
bool ku[100000001]={0},book[30]={0};
int num=0,n,k,a[30];
void dfs(int t,int s,int l)
{
int i;
if(t==k)
{
if(!ku[s])
num++;
}
else
for(i=l+1;i<=n;i++)
{
if(!book[i])
{
book[i]=1;
dfs(t+1,s+a[i],i);
book[i]=0;
}
}
}
int main()
{
long long all=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
all+=a[i];
}
for(long long i=2;i<=all;i++)
{
for(long long j=2;j<=all;j++)
{
if(i*j<=100000000&&!ku[i*j])
ku[i*j]=1;
}
}
for(int i=1;i<=n;i++)
{
book[i]=1;
dfs(1,a[i],i);
}
printf("%d",num);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-5-13 21:05
#include<iostream>
#include<cmath>
using namespace std;
int n,k,a[21],s,t;
bool f[21];
bool ss(int p)
{
int i=2;
while(i<=sqrt(p))
{
if(p%i==0)return 0;
i++;
}
return 1;
}
int xs(int num,int i)
{
for(int j=i; j<=n; j++)
if(f[j])
{
f[j]=0;
s+=a[j];
if(num==k)
{
if(ss(s))t++;
}
else xs(num+1,j+1);
s-=a[j];
f[j]=1;
}
}
int main()
{
cin>>n>>k;
for(int i=1; i<=n; i+=1)
{
cin>>a[i];
f[i]=1;
}
xs(1,1);
cout<<t;
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-5-13 22:06
#include <cstdio>
int x[20],n,k;
int judge(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int cal(int left,int count,int begin,int end)
{
if(left==0)
return judge(count);
int sum=0;
for(int i=begin;i<=end;i++)
sum+=cal(left-1,count+x[i],i+1,end);
return sum;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
int ans=cal(k,0,0,n-1);
printf("%d",ans);
return 0;
}
复制代码
作者:
wzd(temp)
时间:
2018-5-13 22:37
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=24;
struct node
{
int v;
bool x;
}a[N];
int n,k;
void init()
{
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].v);
a[i].x=true;
}
return ;
}
bool is_prime(const long long & lmd)
{
for(int kk=2;kk<=sqrt(lmd);kk++)
if(lmd%kk==0)
return false;
return true;
}
long long orz=0;
long long dfs(int i,int q)
{
if(n-q<k-i)
return 0;
if(i==k)
{
if(is_prime(orz))
return 1;
return 0;
}
long long temp=0;
for(int j=q;j<n;j++)
{
if(a[j].x)
{
orz+=a[j].v; a[j].x=false;
temp+=dfs(i+1,j+1);
orz-=a[j].v; a[j].x=true;
}
}
return temp;
}
int main()
{
init();
printf("%lld\n",dfs(0,0));
return 0;
}
复制代码
作者:
admin
时间:
2018-5-13 22:49
都做得不错!但是怎么感觉大家的都好复杂的样子?看我的:
#include<iostream>
#include<cmath>
using namespace std;
const int mn=21,mk=21;
int a[mn],aa[mn];
int n,k,s,sum;
bool isprime(int x)
{
if (x==1 || x==0) return 0; ///虽然此题没有必要,但是时时要小心!!!
int i=2;
bool b=1;
while (i<=sqrt(x) && b)
if (x%i==0) b=0;
else i++;
return b;
}
void dfs(int i,int sum)
{
int j,kk;
if (i>=k+1)
{
///cout<<sum<<' ';
if (isprime(sum)) s++;
}
else for (kk=a[i-1]+1; kk<=n; kk++) ///不能重复选择的技巧
{
a[i]=kk;
dfs(i+1,sum+aa[kk]);
}
}
int main()
{
cin>>n>>k;
for (int i=1; i<=n; i++) cin>>aa[i];
dfs(1,0);
cout<<s;
}
复制代码
作者:
lyc
时间:
2018-5-13 22:52
#include<iostream>
#include<algorithm>
#include<cmath>
const int maxn = 25;
using namespace std;
bool isprime(int x)
{
for(int i=2; i<=sqrt(x); i++)
if(x%i == 0) return false;
return true;
}
int a[maxn];
int n,k;
int ans;
void dfs(int cnt, int sum, int now)
{
if(cnt == k || now == n+1)
{
if(isprime(sum) && cnt == k)
ans++;
return;
}
dfs(cnt+1, sum+a[now], now+1);
dfs(cnt, sum, now+1);
}
int main()
{
cin>>n>>k;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
dfs(0, 0, 1);
cout<<ans;
return 0;
}
复制代码
作者:
冯文韬
时间:
2018-5-13 23:12
#include<iostream>
#include<cmath>
using namespace std;
int a[25];
int n,k,ans;
bool zs(int x){
if (x<2) return false;
for (int i=2;i<=sqrt(x);i++)
if(x%i==0) return false;
return true;
}
void search(int total,int i,int m){
if (m==k&&zs(total)) ans++;
if (m<k&&k-m<n-i+1) {
search(total+a[i],i+1,m+1);
search(total,i+1,m);
}
if (m<k&&k-m>=n-i+1) search(total+a[i],i+1,m+1);
}
int main(){
cin>>n>>k;
for (int i=1;i<=n;i++) cin>>a[i];
search(0,1,0);
cout<<ans<<endl;
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-5-15 22:39
#include<iostream>
#include<cmath>
using namespace std;
const int mx=21;
int a[mx],aa[mx];
int sum,n,k,s;
int isprime(int x)
{
int i=2;
bool b=true;
if (x==0 || x==1) return 0;
else
{
while (i<=sqrt(x) && b)
{
if (x%i==0) b=false;
i++;
}
}
return b;
}
void dfs(int i,int sum)
{
int j,kk;
if (i>=k+1)
{
if (isprime(sum)) s++;
}
else
{
for (kk=a[i-1]+1; kk<=n; kk++)
{
a[i]=kk;
dfs(i+1,sum+aa[kk]);
}
}
}
int main()
{
cin>>n>>k;
for (int i=1; i<=n; i++) cin>>aa[i];
dfs(1,0);
cout<<s;
return 0;
}
复制代码
作者:
liubo
时间:
2018-5-21 23:17
#include<iostream>
using namespace std;
int num[25],pick[25],n,k,ans;
bool vis[25];
bool is_prime(int x){
int i;
for(i = 2;i * i <= x;i++)
if(x % i == 0) return 0;
return 1;
}
void dfs(int tar){
if(tar > k){
int sum = 0;
for(int i = 1;i <= k;i++)
sum += num[pick[i]];
//cout << sum << " ";
if(is_prime(sum)) ans++;
}
else{
for(int i = pick[tar - 1];i <= n;i++){
if(!vis[i]){
vis[i] = 1;
pick[tar] = i;
dfs(tar + 1);
vis[i] = 0;
}
}
}
}
int main(){
cin >> n >> k;
for(int i = 1;i <= n;i++)
cin >> num[i];
pick[0] = 1;
dfs(1);
cout << ans;
return 0;
}
复制代码
作者:
Scorpio
时间:
2018-6-28 21:35
#include<iostream>
#include<cmath>
using namespace std;
long long a[24],ia[24];
long long i,n,k,p;
void hhh(int i)
{
int j,kk,b=0,s=0;
if(i>=k+1)
{
for(j=1;j<=i;j++)
s=s+a[ia[j]];
for(j=2;j<=sqrt(s);j++)
if(s%j==0)
b=1;
if(b==0)
p++;
s=0;
}
else for(kk=ia[i-1]+1;kk<=n;kk++)
{
ia[i]=kk;
hhh(i+1);
}
}
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)
cin>>a[i];
hhh(1);
cout<<p;
return 0;
}
复制代码
作者:
diggersun
时间:
2018-9-14 19:22
#include <iostream>
using namespace std;
const int mm=22;
int a[mm],aa[mm];
int n,k,s,ss;
int p[10000];
int bb[10000];
void getp()
{
int i,j;
for ( i=2; i<=9999; i++)
for ( j=i; i*j<=9999; j++) bb[i*j]=1;
j=1;
for (int i=2; i<=9999; i++) if (!bb[i]) p[j++]=i;
///for (i=1;i<=j;i++) cout<<p[i]<<' ';
}
bool isprime(int x)
{
int i=1;
bool b=1;
if (x<=1) b=0;
else while (p[i]*p[i]<=x && b)
if (x%p[i]==0) b=0;
else i++;
return b;
}
void cmn(int i)
{
int j,t;
if (i>k)
{
for (s=0,j=1; j<=k; j++) s+=aa[a[j]];
if (isprime(s)) ss++;
}
else for (t=a[i-1]+1; t<=n; t++)
{
a[i]=t;
cmn(i+1);
}
}
int main()
{
getp();
cin>>n>>k;
for (int i=1; i<=n; i++) cin>>aa[i];
cmn(1);
cout<<ss;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-9-16 13:42
刚才发错了[code]#include<iostream>
#include<cmath>
using namespace std;
int n,k,ii,s;
long long c;
int a[25]={};
bool b[25];
bool sushu(int x)
{
int y=sqrt(x);
for(int z=2;z<=y;z++)
if(x%z==0)
return false;
return true;
}
void mysearch(int i)
{
int j;
if (i==k) {if(sushu(s))c++;}
else
for (j=0; j<=n-1; j++)
{
if (b[j])
{
s+=a[j];
b[j]=false;
mysearch(i+1);
b[j]=true;
s-=a[j];
}
}
}
int main()
{
cin>>n>>k;
for(ii=0;ii<=n-1;ii++) {cin>>a[ii];b[ii]=true;}
mysearch(0);
cout<<c;
return 0;
}
复制代码
[/code]
作者:
admin
时间:
2018-9-16 19:20
何宇峰你的bool sushu(int x)有重大隐患,x=1不能判断
作者:
朱品屹
时间:
2020-8-5 11:13
#include<bits/stdc++.h>
using namespace std;
int a[25],aa[25],n,k,x=0,num=0;
bool b[25];
bool isprime(int x)
{
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int i)
{
if(i>k)
{
x=0;
for(int i=1;i<=k;i++)
x+=a[aa[i]];
if(isprime(x))
num++;
//cout<<a[aa[1]]<<' '<<a[aa[2]]<<' '<<a[aa[3]]<<' '<<x<<' '<<num<<endl;
}
else
{
for(int j=aa[i-1]+1;j<=n;j++)
{
if(b[j]==1)
{
aa[i]=j;
b[j]=0;
dfs(i+1);
b[j]=1;
}
}
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=1;
}
dfs(1);
cout<<num<<endl;
return 0;
}
复制代码
作者:
弑魔者魔眼
时间:
2020-8-12 11:56
#include <bits/stdc++.h>
using namespace std;
int a[30];
bool check(int x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
int n,k,ans=0;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
int U=1<<n;
for(int S=0;S<U;S++)
if(__builtin_popcount(S)==k)
{
int sum=0;
for(int i=0;i<n;i++)
if(S&(1<<i)) sum+=a[i];
if(check(sum)) ans++;
}
cout<<ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2