數論學習之約數

2021-10-23 22:08:13 字數 1057 閱讀 3575

最近學數論真的感覺自己腦子很不好用啊,乙個證明題想半天。

感覺一些基礎的知識還是比較重要的,所以就記錄下來吧,加深一下印象。

對於乙個整數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...