除法取余解决方法
在實際做題中,我們經常能遇到對除法取余的式子,比如(a/b)%c。碰到這種情況我們有兩種方法來解決。
通用的方法
(a/b)mod m = [a mod (m*b) ] / b
證明如下:
通過逆元求解
首先說一下費馬小定理
費馬小定理(Fermat’s little theorem)是數論中的一個重要定理,在1636年提出。如果p是一個質數,而整數a不是p的倍數,則有a^(p-1)≡1(mod p)。
然后說一下逆元 如果存在x使得 ax ≡1 mod p,則說x是a的逆元。
通過上面我們知道a(p-1)≡1(mod p),我們將等式換為a * a(p-2) ≡ 1 mod p,這不就說明了a的逆元就是a(p-2)嘛。
回到我們的 (a/b) mod c,通過變換的到 a * 1 * b-1 mod c
我們又知道 bc-1 mod c = 1, 帶入上面的到,a* b c-1 * b-1 mod c
在變換得到a*bc-2 mod c。
這樣就把一個除法的式子轉換為了一個乘法的式子,一般情況下這個c都特別的大,所以b的逆元應該使用快速冪進行求解。而且給出的c也都是一個素數。
推薦例題
???/p>
解題思路,平方和公式 n * (n+1) * (2 * n+1)/6
對于除6,要使用逆元進行求解
ac代碼
#include <iostream>using namespace std;typedef long long ll; const long long MOD = 1000000007;ll qul(ll a, ll b) {ll sum = 1;while (b){if (b&1)sum = (sum%MOD*a%MOD)%MOD;a = (a%MOD*a%MOD)%MOD;b>>=1;}return sum; }int main() {ll n;ll num = qul(6, MOD-2);while (~scanf("%lld", &n)){printf ("%lld\n", (((n%MOD)*((n+1)%MOD))%MOD*((2*(n%MOD)+1)%MOD)%MOD*num)%MOD);}return 0; }總結
- 上一篇: Java图像处理
- 下一篇: kiel中bool类型的使用