您的位置:首页 > 其它

NOIP 2002 普及组 复赛 选数

2017-03-16 15:00 211 查看
NOIP 2002 普及组 复赛 选数

//洛谷 p1036 选数

//难度:普及-

//考点:输入,输出 ,递归,排列组合,质数的判定,深度优先遍历,阶乘计算  

//适用:初中

//小技巧:深度优先遍历,数据有重复,别忘了/f(k) 阶乘

#include <stdio.h>

#include <string.h>

int a[30],b[30],vis[30];

int n,k;

int count=0;

int f(int n){//阶乘

    if(n==1)

        return 1;

    return f(n-1)*n;

}

int isprime(int n){//0非质数,1质数

    int i;

    if(n==1)

        return 0;

    if(n==2)

        return 1;

    for(i=2;i*i<=n;i++)

        if(n%i==0)

            return 0;

    return 1;

}

void dfs(int step){

    int i,j,sum;

    if(step==k+1){

        sum=0;

        for(j=1;j<=k;j++)

            sum+=a[j];

        if(isprime(sum))

            count++;    

        return ;

    }

    for(i=1;i<=n;i++)

        if(vis[i]==0){

            vis[i]=1;

            a[step]=b[i];

            dfs(step+1);

            vis[i]=0;

        }

}

int main(){

    int i;

    memset(vis,0,sizeof(vis));

    scanf("%d%d",&n,&k);

    for(i=1;i<=n;i++)

        scanf("%d",&b[i]);

    dfs(1);

    printf("%d\n",count/f(k));

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: