BZOJ1008 越獄 組合數學 (快速冪)

2021-09-25 12:49:15 字數 1212 閱讀 7070

快速冪

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種宗教,每個犯人可能信仰其中一種。如果 相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生...