测评机: Xeond[6]
得分: 80分
提交日期: 2008-10-27 22:22:00
有效耗时: 532毫秒
测试结果1: 通过本测试点|有效耗时156:ms
测试结果2: 测试结果错误.错误结果为:12
正确结果应为:13
测试结果3: 通过本测试点|有效耗时47:ms
测试结果4: 通过本测试点|有效耗时47:ms
测试结果5: 通过本测试点|有效耗时63:ms
测试结果6: 通过本测试点|有效耗时63:ms
测试结果7: 测试结果错误.错误结果为:12
正确结果应为:13
测试结果8: 通过本测试点|有效耗时62:ms
测试结果9: 通过本测试点|有效耗时47:ms
测试结果10: 通过本测试点|有效耗时47:ms
program Digital;
var
i,n,m,h,f,k,j:longint;
a:array[0..20000] of longint;
function su(a:longint):boolean;
var
t:longint;
begin
if a=2 then exit(true)
else if a mod 2=0 then exit(false);
t:=3;
while t<=trunc(sqrt(a)) do
begin
if a mod t=0 then exit(false);
inc(t,2);
end;
exit(true);
end;
procedure work(i,x,sum:longint);
var
j:longint;
begin
if (x=m) then
begin
if su(sum) then inc(f);
end
else
for j:=i to n do
work(j+1,x+1,sum+a[i])
end;
begin
read(n,m);
for i:=1 to n do
read(a[i]);
work(1,0,0);
write(f);
readln;
readln;
end.
这是怎么回事呀??
#include<fstream>
#include<iostream>
#define MAXN 20
using namespace std;
#define fin cin
#define fout cout
//ifstream fin ("NOIPC2.in");
//ofstream fout ("NOIPC2.out");
bool isprime(int k)
{
if (k<=1) return false;
if (k==2) return true;
if (k%2==0) return false;
for (int i=2;i*i<=k;i++)
if (k%i==0) return false;
return true;
}
int n,k,t=0;
int a[MAXN],visited[MAXN];
void dfs_try(int i,int cut,int amount){
if (i==k){
if (isprime(amount)) t++;
return ;
}
for (int j=cut+1;j<n-k+i+1;j++)
if (!visited[j]){
visited[j]=1;
dfs_try(i+1,j,amount+a[j]);
visited[j]=0;
}
}
int main (void)
{
fin>>n>>k;
for (int i=0;i<n;i++)
fin>>a[i],visited[i]=0;
dfs_try(0,-1,0);
fout<<t<<endl;
return 0;
}