在進行冪運算時乙個乙個乘需要耗費大量時間可以用一種類似二分的演算法來快速運算,這就是快速冪。
比如求x^n,n為偶數,x^n=(x^2)^(n/2),n為奇數,x^n=(x^2)^(n/2)*x;不停地分下去,知道n為0時停止。
#include typedef long long ll;
using namespace std;
ll mod_pow(ll x,ll n)
return ans;
}int main()
在之前的基礎上對乙個數取餘,只需每次運算時都取餘即可(同餘定理)。
#include #define mod 100000007 //mod為取餘的數字
typedef long long ll;
using namespace std;
ll mod_pow(ll x,ll n)
return ans;
}int main()
例題:
time limit: 1 sec memory limit: 162 mb
submit: 11574 solved: 5025
[submit][status][discuss]
監獄有連續編號為1...n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果
相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄
輸入兩個整數m,n.1<=m<=10^8,1<=n<=10^12
可能越獄的狀態數,模100003取餘
2 36種狀態為(000)(001)(011)(100)(110)(111)
bzoj1008
可以從反面考慮,用總的狀態減去不能越獄的狀態數就是結果。總的狀態為m^n,不能越獄的狀態數為m*(m-1)^(n-1)。
在計算時要用到快速冪。
#include #define mod 100003
typedef long long ll;
using namespace std;
ll mod_pow(ll x,ll n) //求x的n次方
return ans;
}int main()
BZOJ 1008 越獄(快速冪)
description監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 input 輸入兩個整數m,n.1 m 10 8,1 n 10 12 output 可能越獄的狀態數,模100...
BZOJ1008 越獄 (快速冪)
給出序列長度n和顏色數m,求出存在相鄰元素顏色相同的染色方案數。正難反易 因為正向解決這個問題比較困難,所以我們可以將問題轉化為求出不存在相鄰元素顏色相同的染色方案數,然後用所有排列的情況減去。對於序列中的每乙個人,只要和前乙個人的顏色不同就可以了,所以共有m 1種選擇。對於第乙個人無論選什麼顏色都...
bzoj1008 數學題 快速冪
1 include2 include3 include4 include5 define rep i,l,r for int i l i6 define clr a,x memset a,x,sizeof a 7 define inf 100003 8using namespace std 9 ty...