唯一分解定理:任何乙個大於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開始,還需請教各位大佬(感謝qq_16171157朋友的指教!!))(最後是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)
最後把這些數在相乘就可以了。
例如:100經過分解之後得到的是
e[i]: 2 0 2
primes[i]: 2 3 5
相乘得2^2*5^2=100.(感謝dawn-k指正錯誤!)
唯一分解定理
任意乙個大於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 每個測試例...