1 solutions

  • 0
    @ 2024-8-2 17:48:31

    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