bool
prime[
31700
];
//
31700*31700 > 1000000000
int
primes[
3500
];
int
cnt
=
0
;// 筛法求素数

void
sieve()
{
memset(prime, 1, sizeof(prime));
prime[0]=false;
prime[1]=false;
int m=31700;
for (int i=2; i<m; i++)
if (prime[i]) {
primes[++
cnt
]=i;
for (int k=i*i; k<m; k+=i)
prime[k]=false;
}
return;
}
分解质因子
vector
<
pair
<
int
,
int
>
>
primeFactor(
int
n)
{
vector < pair <int, int> > v;
for(int i=1; primes[i] * primes[i] <= n; i++ ) {
int k = 0 ;
while ( n %primes[i] == 0 ) {
k ++ ;
n/=primes[i] ;
}
if ( k )
v.push_back(make_pair( primes[i], k));
}
if (n != 1)
v.push_back (pair <int, int> (n, 1));
return v;
}
int
PHI (
int
n)
//
欧拉函数
{
if (n == 1)
return 1;
int m=n;
for(int i=1; primes[i]*primes[i]<=m; i++){
if (m % primes[i] == 0) {
n -= (n / primes[i]);
do {
m /= primes[i];
} while (m % primes[i] == 0);
}
}
if (m != 1)
n -= (n / m);
return n;
}
//
求n的约数
vector
<
pair
<
int
,
int
>
>
v
=
primeFactor(n);
//
分解成素数的积
vector < int > factor; //存放约数
int
sz
=
v.size();
int
bound
=
1
;
for
(
int
j
=
0
; j
<
sz; j
++
)
//
采用数字电路加1法枚举约数
bound
*=
(v[j].second
+
1
);
//
求出最大值bound..
for
(
int
j
=
0
; j
<
bound; j
++
)
{ // 0 ~ bound-1
int fac= 1;
int q=j;
for(int k=0; q && k<sz; k++) { // 模出每一位取几个
int tt=q % (v[k].second+1);
for(int a=0; a< tt; a++)
fac*=v[k].first;
q/=(v[k].second+1);
}
factor.push_back(fac);
}
(提示: 设P是N的因子, 对a属于[1..N], .. 和N的最大公约数是P的a的个数等于PHI(N/P); ) PHI是欧拉函数
width="728" scrolling="no" height="90" frameborder="0" align="middle" src="http://download1.csdn.net/down3/20070601/01184120111.htm" marginheight="0" marginwidth="0">

本文介绍了一种高效的素数筛选方法,并基于此方法实现了分解质因数、计算欧拉函数值及求解整数的约数等功能。通过具体算法实例展示了如何利用这些数学工具解决实际问题。

1196





