數論之約數

2022-09-10 04:33:12 字數 1837 閱讀 9362

目錄

題目大意:輸出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()

}

基於算術基本定理

n = (p1x1)(p2x2)(p3x3)…(pkxk)

約數個數=(x1+1)(x2+1)(x3+1)…(xk+1)

注意,這裡的p1...pi是指質因子

例子

24=2223=2³3

再用各個質數的指數加一後再相乘即為此數的約數個數,

比如 (3+1)(1+1)=42=8, 即表示24有8個約數。

24的約數:1、2、3、4、6、8、12、24

思路就是先把原數分解為質因數,最後把每乙個數的指數累加即可。從a1一直分解到an,由於a的資料過大,此處用雜湊表進行儲存。

題目:求n個數的乘積的約數個數

因此不能乘起來再求,這裡用雜湊表存一下質因子和其指數,用相應的公式求解

# include using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;

int main()

}// x最大公約數可能大於sqrt(x),將剩餘的質因數讀取進去

這裡的約數個數和約數之和 這兩個公式是建立在質因字的前提下

題目:求n個數的乘積的約數之和 同上題一樣

# include using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;

int main()

}if (x > 1) hash[x] ++;

}ll ans = 1;

for (auto i: hash)

ans = ans * t % mod;

}cout << ans;

return 0;

}

題目: acwing3491

題意 : 輸出乙個數a, 讓你求出乙個最小的數b,使得a*b是某數的平方

思路: 求出a的所有質因數及其質因數的指數,那麼ans就是指數為奇數的質因數的乘積

**

# include # include # include # include using namespace std;

typedef long long ll;

int main()

}if(n > 1) hash[n] ++;

for (auto i : hash)

cout << ans;

return 0;

}

數論學習之約數

最近學數論真的感覺自己腦子很不好用啊,乙個證明題想半天。感覺一些基礎的知識還是比較重要的,所以就記錄下來吧,加深一下印象。對於乙個整數n,假如我們想求到這個整數的所有的約數的話,我們只要對其1 n 1 sqrt 1 n 之間找可以被n整除的那些數,然後就可以找到它們的約數了。時間複雜度o n o s...

數論 約數個數

這題是個大水題,只不過資料稍微大了點。結果大家都用那啥的模擬。結果哈哈哈哈哈哈。求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...