1 solutions
-
0
C++ :
#include<iostream> #include<cmath> using namespace std; int n,m,i,ans=0,s=0,a[21],f[10001]={0},p[2000]; void get()//建立10000以内的素数表 { int i,j,k=0; f[1]=1; for(i=2;i<=int(sqrt(10000));i++) if(f[i]==0) { p[k++]=i; for(j=i*i;j<=10000;j+= i)f[j]=1; } } void work(int s) { int i; if(s<=10000){if(f[s]==0)ans++;}//直接判断 else{ for(i=0;p[i]*p[i]<=s;i++)if(s%p[i]==0)return; ans++; } } void search(int d,int pre)//d选的个数,pre前一次选的编号 { int i; if(d>m)work(s); else for(i=pre+1;i<=n-(m-d);i++) { s+=a[i]; search(d+1,i); s-=a[i]; } } int main() { cin>>n>>m; for(i=1;i<=n;i++)cin>>a[i]; get(); search(1,0); cout<<ans; }
Pascal :
var n,k,i,ans:longint; a:array[1..20] of longint; function prime(x:longint):boolean; var i:longint; begin if x=1 then exit(false); for i:=2 to trunc(sqrt(x)) do if x mod i=0 then exit(false); exit(true); end; procedure search(m,depth,sum:longint); var i:longint; begin if depth>k then begin if prime(sum) then inc(ans); exit; end; for i:=m+1 to n do search(i,depth+1,sum+a[i]); end; begin readln(n,k); for i:=1 to n do read(a[i]); ans:=0; search(0,1,0); writeln(ans); end.
Java :
import java.util.*; public class Main{ static int[] a; static int n,k,ret = 0; public static void main(String[] args){ Scanner sc = new Scanner(System.in); n = sc.nextInt(); k = sc.nextInt(); a = new int[n+3]; for(int i=0;i<n;i++) a[i] = sc.nextInt(); f(0,0,0); System.out.println(ret); } static void f(int num,int pos,int sum){ if(num==k){ if(isPrime(sum)) ret++; return ; } if(pos>=n) return; f(num+1,pos+1,sum + a[pos]); f(num,pos+1,sum); } static boolean isPrime(int sum){ for(int i=2;i<=Math.sqrt(sum);i++) if(sum%i==0) return false; return true; } }
- 1
Information
- ID
- 1448
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By