本文主要講述了算術基本定理的內容,具體的應用形式,重點結合例題展示如何使用算術基本定理求解問題。
算術基本定理
算術基本定理可表述為:任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積n=p1a1p2a2p3a3......pnan,這裡p1
算術基本定理是初等數論中一條非常基本和重要的定理,它把對自然數的研究轉化為對其最基本的元素——素數的研究。唯一因子分解的思想從本質上講是指以下兩種性質: 「存在性和唯一性」。所謂「存在性」就是指乙個元素可以分解為有限多個不可約因子的乘積;「唯一性」是指這種分解表示在某種意義上來說是唯一的。
定理應用
演算法實現
1 typedef long可以用如下**直接輸出2 到100的質因數分解結果long
ll;2
const
int maxn = 1e6 + 7
;3 ll a[maxn], b[maxn];//
a[i]表示第i個質因子,b[i]表示第i個質因子的指數
4void fac(ll n, int& tot) 16}
17}18if(now != 1)
22 }
1 #include 2 #include 3 #include 4view codeusing
namespace
std;
56 typedef long
long
ll;7
const
int maxn = 1e6 + 7
;8 ll a[maxn], b[maxn];//
a[i]表示第i個質因子,b[i]表示第i個質因子的指數
9void fac(ll n, int& tot) 21}
22}23if(now != 1) 27}
2829
intmain()
3038}39
return0;
40 }
例題解析
lightoj 1341 aladdin and the flying carpet
題意給出乙個長方形的面積a(不是正方形),給出該長方形最小的邊b,問組成該面積的長方形有多少種組合方案。比如12 2,有、兩種組合方案。
解題思路
問有多少種組合方案,其實就是面積a有多少對因子的乘積等於a,然後去掉最小邊不滿足條件的對兒數。普通暴力尋找因子對兒數的方法,肯定是要超時的。這裡使用唯一分解定理的第乙個應用,計算出總的因子數,然後除以2,再減去不符合條件的因子對數即可。需要注意的是每次不必全部試除一遍,不然會超時,這就是這種方法的時間優化之處。
**
1 #include 2 #include 3 #include 4 typedef longlightoj 1236 pairs forming lcmlong
ll;5
const ll maxn = 1e6 +7;6
bool
isp[maxn];
7int
pis[maxn], tot;89
void getp(ll n)
16for(int j = 1; (j <= tot) && (i * pis[j] <= n); j++) 20}
21}22 ll fac(ll n)
34 ans *= (cnt + 1
);35}36
}37if(now != 1
)38 ans *= 1 + 1;39
return
ans;40}
41ll solve(ll s, ll b)
51return
ans;52}
53int
main()
5464
return0;
65 }
題意給乙個n(1 ≤ n ≤ 1014),問滿足lcm(i, j) = n (1 =< i, j <= n 且 i <= j)的(i, j)有多少對
解題思路
一看n的大小就知道暴力肯定是不行了,我們試著用算術基本定理求解一下,將n = p1^x1 * p2^x2 * p3^x3...ps^xs(其中s是唯一分解式中所有質因子的個數)
先假設n = p1^x1;
要使 lcm(i, j) = n,只有兩種方法:
(1)i = p1^x1,則 j = p1^m(m屬於[0, x1]), 這樣(i, j)共有 (x1 + 1)種
(2)j = p1^x1,則 i = p1^n(n 屬於[0, x1]), 這樣(i, j)共有 (x1 + 1)種
那麼當 n = p1^x1 時答案就是2 * (x1 + 1)對(i, j),但是當m == n時這一對是計算重複的,所以需要 -1,則最終答案是2 * (x1 + 1) - 1 = 2 * x1 + 1;
推廣至n = p1^x1 * p2^x2 * p3^x3...ps^xs(其中s是唯一分解式中所有質因子的個數)可得總的方案數等於ans = (2 * x1 + 1) * (2 * x2 + 1) * (2 * x3 + 1) ...(2 * xs + 1);
題目中要求的是i <= j,所以需要將總的數目除以2,又由於當i 、j都等於n時只計算了一次,所以除以二之後需要再加上。故最終答案是 ans = ans/2 + 1;
**如下
1 #include 2 #include 3 #include 4 typedef longlightoj harmonic numberlong
ll;5
const ll maxn = 1e7 +7;6
bool
isp[maxn];
7int pis[maxn/10
], tot;89
void getp(ll n)
16for(int j = 1; (j <= tot) && (i * pis[j] <= n); j++) 20}
21}22 ll fac(ll n)
34 ans *= ( 2 * cnt + 1
);35}36
}37if(now != 1
)38 ans *= 2 * 1 + 1;39
40return
ans;41}
42ll solve(ll n)
46int
main()
4757
return0;
58 }
題意給出n(1 ≤ n ≤ 108)計算出調和級數的結果
解題思路
雖然沒有直接的公式,但是尤拉曾給出過乙個近似公式計算調和級數的和,但是由於前幾項誤差較大,所以我們先計算前10000的結果,之後的使用公式計算。
**
1 #include 2 #include 3 #include 4最後總結一下使用算術基本定理的心得,使用的時候注意分解,如何使用求得的正因子個數之和,以及所有正因子數之和,來計數。關鍵還是將問題轉換為數學模型。5const
int maxn = 100010;6
using
namespace
std;
7const
double c = 0.57721566490153286060651209;8
double
a[maxn];910
intmain()
1116
intt;
17int
n;18 scanf("
%d", &t);
19for(int t = 1; t <= t; t++)
25else28}
29return0;
30 }
算術基本定理
例題一 計算n!末尾0的個數 輸入 第一行上有個數字,表示接下來要輸入數字的個數。然後是m行,每行包含乙個確定的正整數n,1 n 1 000 000 000 輸出 對輸入行中每乙個資料n,輸出一行,其內容是n!中末尾0的個數 分析 對於任意乙個正整數,那麼其末尾0必然可以分解成2 5,每乙個0必然和...
算術基本定理
因為畢設要求,需要對這些初等數論的知識學習,做個筆記,以便日後複習。算術基本定理可表述為 任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積n n的標準分解式。最早證明是由歐幾里得給出的,現代是由陳述證明。此定理可推廣至更一般的交換代數和代數數論。方法一 先用現代陳述方...
poset Dilworth定理及其應用
引用三篇比較好的文章,是對鏈,反鏈,偏序集,dilworth的講解和證明 ttang 神牛的筆記,axl牛,lambda2fei牛 推薦四個可以用此方法做出的習題 對於邊界問題,需要帶數試一試 hdu 1257 include include include include includeusing...