首先我們將這個數化成唯一分解的形式, 也就是這樣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 通過這個我們可以對...