數論問題之質數

2021-09-10 16:45:48 字數 3363 閱讀 5063

若乙個正整數無法被1和它自身之外的任何自然數整除,則稱該數為質數(素數),否則該數為合數。
質數的判定用試除法:

bool is_prime

(int n)

return

true

;}

質數的篩選方法:

埃式篩法和線性篩法:鏈結(之前寫過,就不寫了)。

算術基本定理:

任何乙個不大於1的正整數都能唯一分解為有限個質數的乘積,可寫作

n=p1c1p2c2p3c3……pmcm

其中ci為正整數,pi為質數,滿足p11,則說明n為質數。

#include.h>

using namespace std;

const int n

=1e6+10

;int p[n]

,c[n

],m;

//p陣列表示n的因子,c陣列表示對應的因子的個數

void

devide

(int n)}if

(n>

1) c[

++m]

=n,c[m]++;

for(int i=

1;i<=m;i++)}

int main()

poj1845sumdiv

題意:求ab的所有約數之和mod9901.

思路:

把a分解質因數a=p1c1p2c2p3c3……pmcm

ab=p1b*c1p2b*c2p3b*c3……pmb*cm

根據乘法分配律,ab的所有約數之和就是:

(1+p11+p12+p13+……+p1b*c1)*(1+p21+p22+p23+……+p2b*c2) * …… *(1+pm1+pm2+pm3+……+pmb*cm)

在使用分治法求sum(p,c)=1+p1+p2+p3+……+pc

當c為奇數時有偶數項,當c為偶數時有奇數項

c為奇數:sum(p,c)=1+p1+p(c-1)/2+……+p(c+1)/2+……+pc

=(1+p1+……+p(c-1)/2)+p(c+1)/2 * (1+p1+……+p(c-1)/2)

=(1+p(c+1)/2) * (1+p1+……+p(c-1)/2)

=(1+p(c+1)/2) * sum(p,(c-1)/2)

c為偶數:sum(p,c)=1+p1+p(c-2)/2+……+pc/2+……+pc-1+pc

==(1+pc/2) * sum(p,c/2-1)+pc

**:

#include

#include

#include

using namespace std;

const int mod=

9901

;vector

> v;

int ksm

(int p,int c)

return ans;

}int get_sum

(int p,int c)

int main()

v.push_back

(make_pair

(i,sum));

}}if(a>

1) v.

push_back

(make_pair

(a,1))

; int ans=1;

for(int i=

0;isize()

;i++

) cout<}

poj2689prime distance

題意:給定倆個整數l,r(1<=l<=r<=231,r-l<=106),求閉區間[l,r]內 相鄰來個數的差最大是多少,輸出這倆個質數。

思路:因為l,r的範圍很大不能使用暴力做法,但是r-l的值小,我們可以先篩選出2-sqrt( r)之間的左右質數,然後在用這些質數去篩選l-r內的所有質數,最終沒有被標記的就是l-r內的質數。

先處理2-sqrt(231)內的質數,sqrt(231)約等於46340.(可以打表也可以使用線性篩)。

**:

#include

#include

#include

#include

#include

using namespace std;

const int m

=46430,n

=1e6+10

,inf

=0x7fffffff

;vector p,ans;

bool v[n]

;int main()

} int l,r;

while

(cin>>l>>r)

}for

(unsigned int i=l;i<=r;i++)if

(v[i-l]

) ans.

push_back

(i);

int minn=

inf,maxx=

0,x1,x2,y1,y2;

for(int i=

0;isize()

-1;i++)if

(d>maxx)}if

(!maxx)

puts

("there are no adjacent primes.");

else

printf

("%d,%d are closest, %d,%d are most distant.\n"

, x1, y1, x2, y2);}

}

ch3101階乘分解

題意:給定整數n(1<=n<=106),試把階乘n!分解質因數,按照算術基本定理的形式輸出分解結果中的pi和c1.

思路:n!的質因數p的個數就是1-n中每個數包含質因數p的個數和,包含質因子p的個數為n/p,接下來計算p2的個數為n/p2,直到n/(longn/longp),加在一塊就是p的個數和。

**:

#include 

#include

#include

#include

#include

using namespace std;

int isprime[

1000000+10

];int prime[

1000000+10

];int c;

void

prime

(int n)}}

int main()

}

數論基礎之質數

文章是看了好多好多大佬的部落格才自己總結出來的,有些地方覺得大佬的文字很精煉於是學習了一下,若是有人認為哪些地方我是不道德的,請指出,謝謝。質數,也稱素數,只包含兩個因數,且乙個因數為1,乙個因數為它本身。無論是數論 計算機應用上還是acm上,質數都是基礎且極其重要。於acm上,質數經常用於判斷乙個...

數論 質數距離

給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...

簡單數論 質數

在 1 的整數中,如果只包含1和本身兩個約數,這個數就被稱為質數 素數。質數的判定 試除法 暴力列舉 o n bool is prime int n 簡單優化 o sqrt 對任意的d能整除n d n 顯然n除上d也能整除n frac n 如n 12,3是12的約數,4也是12的約數 2是12的約數...