唯一分解定理

2022-07-25 09:12:08 字數 1216 閱讀 2714

唯一分解定理:任何乙個大於1的自然數n,如果n不是質數,那麼n可以分解成有限個素數的乘積;例:n=(p1^a1)*(p2^a2)*(p3^a3)......其中p1在做 uva10375 時學到了這個演算法,雖然自己理解的還不透徹,先把自己的看法寫下來,日後再完善;

要用唯一分解定理第一步當然是素數打表了;之前素數打表一直用笨辦法,翻了n多個題解後,看到了很多好的方法。記一下以備日後回顧用。

int primes[maxn+10],vis[maxn+10

];void

getprimes()

}}

哈?!!第一眼表示真的沒看懂,again 嗯懂了一點點,解釋一下:

vis陣列中0表示是素數,1表示不是素數。從第乙個素數開始

2:2*2,  2*2+2,2*2+2+2.......

3:  3*3,3*3+3,3*3+3+3.......

後面的都不是素數,所以把這些都篩掉,然後把碰到的vis[i]為0的i存到primes中就可以了,這樣就完成了素數打表。(至於為什麼從i*i開始,還需請教各位大佬)(最後是vis陣列表示有哪些素數)

memset(primes,0,sizeof

(primes));

int m=sqrt(maxn+0.5),len=0

;for(int i=2; i<=m; i++)

}}for(int i=2;i <= maxn;i++)

個人感覺這兩種方法原理是一樣的,第二種就只是少開了陣列。

ok,打完表接下來就是進行分解了。

void add_integer(int n,int

d)

if(n == 1)//

提前結束,節約時間

break

; }

}

n是我們要分解的數字,當n在分子上的時候d為1,在分母上的時候d為-1;e陣列表示的是i這個數能夠分解成幾個primes[i]相乘存的數值是primes[i]的次方。

double ans = 1

;for(int i=0; i <10000; i++)

最後把這些數在相乘就可以了。

例如:100經過分解之後得到的是

e[i]:           2 0 2

primes[i]:  2 3 5

相乘得2^2*5^2=100.

唯一分解定理

任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。c include include include using namespace std int main int num 32 int local...

唯一分解定理

唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...

唯一分解定理

problem description 假設x是乙個正整數,它的值不超過65535 即1 x 65535 請編寫乙個程式,將x分解為若干個素數的乘積。input 輸入的第一行含乙個正整數k 1 k 10 表示測試例的個數,後面緊接著k行,每行對應乙個測試例,包含乙個正整數x。output 每個測試例...