By Jalan
知识工具需求
数学
质数验证
题解
思路
求素数然后求组合数的问题
很简单的题目,但是求素数这里水比较深
代码中的求素数方法是我在多种方案下验证int左右prime最快的方法,在longlong范围内也不会差米勒罗宾很多.
编写用时
10分钟
代码
CPP
class Solution
{
public:
int numPrimeArrangements( int n )
{
int primeCount = 0;
int noPrimeCount = n;
while ( n ) {
if ( isPrime( n ) ) {
primeCount++;
}
n--;
}
noPrimeCount = noPrimeCount - primeCount;
long long a = 1, b = 1;
while ( noPrimeCount ) {
a = ( a * noPrimeCount ) % ( int )( 1e9 + 7 );
noPrimeCount--;
}
while ( primeCount ) {
b = ( b * primeCount ) % ( int )( 1e9 + 7 );
primeCount--;
}
return ( a * b ) % ( int )( 1e9 + 7 );
}
bool isPrime( int num )
{
{
if ( num == 1 ) {
return 0;
}
//两个较小数另外处理
if ( num == 2 || num == 3 )
return 1;
//这部分的处理其实最好在函数外面完成
}
//不在6的倍数两侧的一定不是质数
if ( num % 6 != 1 && num % 6 != 5 )
return 0;
int tmp = sqrt( num );
//在6的倍数两侧的也可能不是质数
for ( int i = 5; i <= tmp; i += 6 )
if ( num % i == 0 || num % ( i + 2 ) == 0 )
return 0;
//在6两侧的数可能本身是有倍数关系的,需要检测能否被从5开始的6的两侧的数整除
//排除所有,剩余的是质数
return 1;
}
};
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀
@.@
也欢迎关注我的CSDN账号呀=]
**开心code每一天**