素数
素数筛
线性时间内找出 2~num的所有素数
bool check[maxn];//0是素数
int prime[maxn];// 存素数
int getprime(int num)
{
int pos=0;
int flag;
memset(check,0,sizeof(check));
memset(prime,0,sizeof(prime));
for (int i = 2 ; i <= num ; i++)
{
if (!check[i])//是素数
prime[++pos] = i;
for (int j = 1 ; j <= pos && i*prime[j] <=num ; j++)
{
check[i*prime[j]] = 1;
if (i%prime[j] == 0)
break;
}
}
return pos;
}
约数个数
对于任意一个大于1正整数n
可以分解质因数:
那么我们可以由公式得到约数个数:
int primecount(int n){
int ans = 1,sum;
int k = sqrt(n*1.0);
for(int i = 0; prime[i] < k; i++){
if(n % prime[i] == 0){
a = 0;
while(n % prime[i] == 0){
a++;
n /= prime[i];
}
ans *= (a + 1);
}
}
if(n > 1)
ans *= 2;
return ans;
}
约数之和
公式如下:
int pow_mod(int a,int n,int MOD){
int ans = 1;
while(n){
if(n&1)
ans = (ans*a)%MOD;
n >>= 1;
a = (a*a)%MOD;
}
return ans;
}
int primesum(int n){
int ans = 1,sum;
int k = sqrt(n*1.0);
for(int i = 0; prime[i] < k; i++){
if(n % prime[i] == 0){
sum = 0;
while(n%prime[i] == 0){
sum++;
n /= prime[i];
}
ans *= (pow_mod(prime[i],sum+1,MOD)-1)/(prime[i]-1);
}
}
if(n > 1)
ans *= ans(n*n-1)/(n-1);
return ans;
}