質因子

在數論里。某一正整數的質因子指能整除該數的質數整數。

質因子-定義

在數論里,某一正整數的質因子指能整除該數的質數整數。

相關的定理

任何一個大於1的自然數N,都可以唯一分解成有限個質數的乘積 N=(P_1^a1)*(P_2^a2)......(P_n^an) , 這裡P_1<...

這樣的分解稱為N 的標準分解式。

質因子-求質因子和的算法

求因子和的方法:

sqrt( n ) 太慢,可以用一下DP的思想,

把質因子分析出來 ai^x,

那么 再乘 一個 ai+1 ,因子和就增加了原來的 ai+1 倍

如果這個質因子是2次冪,那么還得增加原來那一層的 (ai+1)^2倍

速度因該是 質因子的指數的和,但是受到求質因子速度的制約

36:

0: 1

1: 2 4 =( 1*2,1*2^2 ) sum = 1+(2)+(4); //2*2

2: 3 6 12 , 9 18 36 sum = 1+2+4+ (3+6+12) + (9+18+26)

也就是說,如果我們知道了一層的sum,那么就可以推出下一層的sum

知道了一個數的因子和,就可以推知他的質數倍^x 的那個數的因子的和,

DP來解決這道題,對於數 x,把它除盡一個質數,那么x/a^k = y

那么 y 就是上一層的那個sum

而對於x,存在 x = (1+a+a^2+a^3..a^k)*y

上面這個方法要 100 s, 題目要求不是求因子和,所以如果有質數在 [a,b] 內,那么最大的質數就是answer

主要的函式:

cal (x) 求 x 的因子和

int cal(int a) //計算 a 的因子和

{

int i;

int last,now;// sum

last = 1;now = 0;

int x;// 因子的^x 與前一階段

int t = a;

for ( i=0;primes[ i ] <= a;i++ )

{

if ( a%primes[ i ] == 0 )

{

x = last;

now = last;

while ( a %primes[ i ] == 0 )

{

// printf("%d can div %d :", a ,primes[i] );//debug

a /= primes[i];

x *= primes[ i ];

now += x;

// printf("now: %d x: %d\n",now,x);//debug

}

// printf("now: %d last: %d\n",now,last);//debug

last = now;

}

}

return last - t;

// printf("answer is %d\n",last);

}

第二個DP雖然TLE,但是感覺有思考價值,求很多數的因子和時,也許能用的到

void work2()

{

int i,j;

dp[ 1 ] = 1;

int temp;

for ( i=2;i<=1000000;i++ )

{

for ( j=0; primes[ j ]<=i;j++ ) //尋找上一層

if ( i % primes[ j ] == 0 )

break;

int i2 = i;

temp = 1;//求前面那個係數

while ( i2 % primes[ j ] == 0 )

{

temp = temp* primes[ j ] + 1;

i2 /= primes[ j ];

}

int last = dp [ i2 ];

dp [ i ] = temp* last;

// printf("dp[ %d ] = %d\n",i,dp[i]);

if (i%1000 == 0) cout<<

}

}

相關詞條

相關搜尋

熱門詞條

聯絡我們