【研究內容】
數論,是專門研究整數的純數學的分支,而整數的基本元素是素數(也稱素數),所以數論的本質是對素數性質的研究。
acm中的數論主要涉及素數、約數、同餘和數論函式等相關知識。
【基本概念】
整數集合:?=
自然數集合:?=
整除:若 ?=??,其中 ?,?,? 都是整數,則 ? 整除 ?,記做 ?|?,否則記做 ?∤? 。
約數:如 ?|? 且 ?≥0,則稱 ? 是 ? 的約數(因數),? 是 ? 的倍數。
1 整除任何數,任何數都整除 0 。
若 ?|?,?|?,則 ?|(?+?), ?|(?−?) 。
若 ?|?,則對任意整數 ?,?|(??) 。
傳遞性:若 ?|?,?|?,則 ?|? 。
因子:正整數 ? 的平凡約數為 1 和 ? 本身,? 的非平凡約數稱為 ? 的因子。如 20 的因子有 2、4、5、10 。
一、整除性
若a和b都為整數,a整除b是指b是a的倍數,a是b的約數(因數、因子),記為a|b。
二、素數
【素數判定方法】
1、暴力
直接遍歷2~n
\sqrt
n看有沒有數能被n整除。
bool
isprime
(int n)
}
2、篩法
這裡就是新的方法了。
首先,我們篩掉2的倍數,然後篩掉3的倍數,然後篩掉5的倍數……
剩下來的數就是素數。
這裡用到陣列來標記,如果是其倍數的話直接標記false,剩下的就是素數了。
bool isprime[
1000010];
void
eratos
(int n)
}
三、因數分解
算術基本定理:對於每個整數n,都可以唯一分解成素數的乘積,如圖所示:
然後可以化成這種形式:
}【優化】
利用埃氏篩法可以快速實現素因數分解,只要在判定質數時記錄下每個數值的最小素因數即可。
演算法實現如下:
#define maxn 1000000
bool isprime[maxn+1]
;int minfactor[maxn+1]
;//記錄每個數的最小素因數的陣列
void
eratos
(int n)
for(i =
2;i * i <= n;
++i)}}
}vector<
int>
factor
(int x)
return ret;
}
近期總結
近期做的題基本都是打codeforces做的題,打了三場。
怎麼說呢,總感覺做題時候思維跟不上,單純的用數學邏輯來思考題目,就像是第二場testing round #16的c題,用map來做很簡單就可以ac,但我用陣列一直超時,做了大半個小時也一直卡在第二個測試資料,然後超時。這是思維的侷限,現在也不知道用什麼方法來突破這種侷限,只希望能夠做題做多了熟悉做題的方法了來解決這個問題。
還發現自己的乙個問題,就是在做最近的這場div4的比賽的時候(不得不說div4並不比div3簡單),在做b題的時候,總是不敢去深想,怕深想浪費時間,直接去做的c題,心理有個怕麻煩,怕浪費時間的心理,稍微有點焦慮的感覺,這是應該克服的,比賽加不加分並不重要,關鍵在於能不能把題目解決,做題本來就是乙個鍛鍊思維的過程,然而我卻過分在意分數了。這點需要改。
還有部分題目沒有補完,抓緊時間盡快吧。
最後,繼續堅持,加油!
ACM數論總結
斷斷續續的學習數論已經有一段時間了,學得也很雜,現在進行一些簡單的回顧和總結。學過的東西不能忘啊。1 本原勾股數 概念 乙個三元組 a,b,c 其中a,b,c沒有公因數而且滿足 a 2 b 2 c 2 首先,這種本原勾股數的個數是無限的,而且構造的條件滿足 a s t,b s 2 t 2 2,c s...
數論模板總結
尤拉函式 函式的值 通式 x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。1 1 唯一和1 互質的數就是1本身 注意 每種質因數只乙個。比如12 2 2 3 尤拉公式 那麼 12 12 1 1 2 1 1 3 4 ...
數論知識總結
錯排公式 lucas定理 組合數取模 素數求解 尤拉函式 大數相乘 反素數兩直線是否相交 點到直線的最短距離 三分1三分2 第一類stirling數和第二類stirling數 卡特蘭數 判斷乙個點是否在多邊形內部 博弈之 nim 遊戲和 sg 函式 nim博弈變形 anti nim 博弈論重要演算法...