求解乙個數的所有約數之積

2022-03-21 03:32:11 字數 830 閱讀 7942

首先我們將這個數化成唯一分解的形式, 也就是這樣x = p1^a1*p2^a2*...pn^an, 我們定義答案為f(x),首先我們定義d(x)為x的約數的個數, 那麼f(x) = x^(d(x)/2), 由費馬小定理m為素數a^(m-1) == 1 (mod m) => a^x = a^x%(m-1) (mod m) 其中m為素數,這樣我們就可以在計算中給冪函式的冪取摸了, 當a b互質的時候, d(ab) = d(a)*d(b)  f(ab) = f(a)^d(b)*f(b)^d(a) f(pi^ai) = pi^(ai+1)*ai/2..由這三個公式我們就可以計算x的約數之積了, **如下:

#include #include 

#include

using

namespace

std;

typedef

long

long

ll;const ll mod = 1000000007

;int

m;int numhash[200000+10

], num;

int getid(int

t)ll prime[

200000+10], primenum[200000+10

];ll powmod(ll a, ll b)

return res%mod;

}int

main()

ll ans = 1, d = 1

;

for(int i=0; i)

printf(

"%i64d\n

", ans);

return0;

}

複雜度更低的求乙個數的所有約數

最簡單的想法是對所有小於這個數的數逐個遍歷取餘是否為0。但是這種方法的複雜度是o n 的,如下 n int input list1 for i in range 1 n 1 if n i 0 print list1 做題的時候往往這樣複雜度過高,我們將遍歷變成 1,n 0.5 求前一半的約數,求出來...

求乙個數約數的個數

求約數的個數 計算乙個整數的約數個數 輸入格式 輸入乙個整數 輸出格式 輸出一行,為輸入整數的約數的個數 樣例輸入 10 樣例輸出 4ac import math number int raw input count 0 sqrt float math.sqrt number if number s...

複習之求乙個數的約束之積模乙個質數

首先我們知道對於乙個數x,他的約數之積可以表示為f x x d x 2 其中d x 為x的約束的個數。當x很大的時候d x 會變的非常大,很難將確切的d x 算出來,費馬小定理告訴我們當p是質數的時候a p a mod p 當a與p互質的時候式子就變成了a p 1 1 mod p 通過這個我們可以對...