首先我們知道對於乙個數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), 通過這個我們可以對d(x)取模從而簡化計算。現在我們考慮兩個數a與b互質,
d(ab) = d(a)*d(b), f(ab) = f(a)^d(b) * f(b)^d(a), f(pi^ai) = pi^(ai*(ai+1))/2, 有了這個公式, 我們將x化為唯一分解式之後很快就能解決。**如下:
#include #include#include
#include
using
namespace
std;
typedef
long
long
ll;const ll mod = 1000000007
;int pi[100], ai[100
];int
len;
ll powmod(ll a, ll b)
return
res;
}int
main()
ll fa=1, da=1
;
for(int i=0; i)
cout
return0;
}
求解乙個數的所有約數之積
首先我們將這個數化成唯一分解的形式,也就是這樣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為素數,這樣我們就可以在計算中給冪函...
求乙個數約數的個數
求約數的個數 計算乙個整數的約數個數 輸入格式 輸入乙個整數 輸出格式 輸出一行,為輸入整數的約數的個數 樣例輸入 10 樣例輸出 4ac import math number int raw input count 0 sqrt float math.sqrt number if number s...
求乙個數中1的個數
碰到遇到乙個有趣的題,求乙個數二進位制的表示中1的個數,該題有兩種解法,一種是使用短除法將該數直接轉化為二進位制數,另一種比較巧妙的演算法是使用與運算,原理如下圖所示 依照此種思入有如下演算法 int numberof1 solution3 int i return count 依照短處法的思路 有...