质数的排列

### 学习笔记

1.c++可以用long代替longlongint

2.c++^代表异或!,要算a的b次方:pow(a,b),要记得加头文件

3.1e9代表10的9次方!

题目:(力扣原题)

请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;(即质数应该排在第质数位上,如3排在第1位就是不行的,3是质数而1不是)

需要返回可能的方案总数。

让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。

由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

### 代码

```cpp

const int MOD = 1e9 + 7;

class Solution {

public:

    int numPrimeArrangements(int n) {

        int  primenum[101];//primenum[n]代表1到n的质数数量

        allprime(primenum);

        int i;

        int ans=(int)((factorial(primenum[n])*factorial(n-primenum[n]))%MOD);

        return ans;

    }

    long factorial(int n){

        if(n==0) return 1;

        else return ((n*(factorial(n-1))%MOD) % MOD);

    }

    void allprime(int primenum[]){

        primenum[0]=0;

        primenum[1]=0;

        int i;

        int prime[100];//用于从小到大保存质数

        int j;

        bool isP=1;

        memset(prime,0,100);

        //外层循环,i为当前循环需判断是否为质数的数,是则将该数加入prime数组并将primenum[i]赋值为primenum[i-1]+1,否则将primenum[i]赋值为primenum[i-1]

        for(i=2;i<101;i++){

            isP=1;

            //内层循环,i依次判断能否被小于i的素数整除

            for(j=0;prime[j]!=0;j++){

                if(i%prime[j]==0) isP=0;

                else;

            }

            if(isP){

                primenum[i]=primenum[i-1]+1;

                prime[j]=i;

            }

            else{

                primenum[i]=primenum[i-1];

            }

        }

    }

};

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值