若乙個正整數無法被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的約數...