最近學數論真的感覺自己腦子很不好用啊,乙個證明題想半天。
感覺一些基礎的知識還是比較重要的,所以就記錄下來吧,加深一下印象。
對於乙個整數n,假如我們想求到這個整數的所有的約數的話,我們只要對其1−n
1-\sqrt
1−n
之間找可以被n整除的那些數,然後就可以找到它們的約數了。時間複雜度o(n
)o(\sqrt)
o(n).
**:
//試除法
int factor[
1600
],m=0;
for(
int i=
1;i*i<=n;i++
)}
但是,如果我們一次求出1-n之間的所有的數的約數的話,我們肯定是不能用這種低效的方法的。接下來,我們來介紹一下倍除法,我們發現,對於每個數d,1-n之間以d為約數的數有d,2d,3d…[n/d]d,那麼我們就可以利用線性求解的方法來進行處理。時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)**:
//倍除法
vector<
int> factor[
1500];
for(
int i=
1;i<=n;i++
)}
接下來,介紹乙個名詞:反素數
我們用g(x)表示乙個數x的約數的個數,對於任意的0g(i)的話,那麼就稱這個數為反素數。
還有一些引理:
1、1-n之中任何數的質因子都不會超過10個,而且每個質因子的個數不會超過30個,這個由於10!個數和2^30的範圍就可以得到。
2、如果乙個數x為反素數的話,那麼x的分解質因數後可以寫作2c1
∗3c2
∗...
29c10
2^*3^*...29^}
2c1∗3
c2∗
...2
9c10
,而且c1>=c2>=c3>=c4>=c5…>=c10,也就是這些質數的指數都是單調非遞增的。
數論之約數
目錄 題目大意 輸出n個數,分別輸出這n個數所有的約數 include include include using namespace std const int n 1e5 10 vectorsolve int n sort a.begin a.end return a int main 基於算術...
數論 約數個數
這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求a b之間每個數的約數個數的總和。input 一行兩個正整數a b,以乙個空格隔開。output 一行乙個整數,即答案。資料範圍 對於50 的資料,1 a b 1000 對於100 的資料,1 a b 10,000,0...
數論基礎之素數,約數
關於約數 唯一分解定理 任何數都可由素因子之積構成 int p 100 a 100 cnt void divide int n if n 1 for int i 1 i cnt i cout 方法2 離線做法,預處理出乙個質因子樹。預處理o nlogn 查詢乙個數o logn void init v...