快速冪
int
pow(
int a,
int k)
return ans;
}
快速冪求模
如果超過計算機的取值範圍了,那麼快速取模的數可以是很大很大的數,因此需要進行取模。
由以上演算法可以,最終的冪值就是各個值相乘,其中的某個乘式取模和算出整個值取模效果是一樣的,效率更高。
int
pow_mod
(int a,
int k,
int mod)
return ans;
}
取模解釋:
//2^n = 13 ,拆分成 13 = 1 + 4 + 8,即 2^13 = 2^1 * 2^4 * 2^8。
//所以在下面兩處取模對結果沒有影響。
//取模,防止進行稍微大點的數運算時超過取值範圍。
例題:bzoj1008 越獄 組合數學
description
監獄有連續編號為1…n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄
input
輸入兩個整數m,n.1<=m<=108,1<=n<=1012
output
可能越獄的狀態數,模100003取餘
sample input
2 3sample output
6hint
6種狀態為(000)(001)(011)(100)(110)(111)
n個房間 m種宗教,總狀態數即m^n
若不越獄,即相鄰房間的兩個人宗教不同,所以第乙個人有m種選擇,
則後面的每乙個人都有m-1種選擇,
所以不越獄的狀態總數等於m(m-1)^(n-1);
所以越獄的狀態數就為m^n -m(m-1)^(n-1)。
解決了這個問題後,快速冪解決就好了。
#include
#define mod 100003
#define ll long long
using namespace std;
ll m,n;
ll qpow
(ll a,ll b)
return c;
}int
main()
bzoj1008 越獄 組合數學
監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 2 366種狀態為 000 001 ...
BZOJ 1008 越獄(組合數學)
思路 首先全部情況有m n種,不滿足題意的情況有m m 1 n 1 種情況,然後快速冪就好啦 include includeusing namespace std define ll long long define mod 100003 ll powmod ll a,ll b return ans...
BZOJ 1008 越獄(組合數學)
description 監獄有連續編號為 1.n 1.n的 n n 個房間,每個房間關押乙個犯人,有 m role presentation style position relative m m種宗教,每個犯人可能信仰其中一種。如果 相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生...