标签:相同 复杂度 快速幂 with 不能 第一个 define turn 不同
题目:BZOJ1008、洛谷P3197。
题目大意:有n个人,m种宗教信仰,被关在1~n编号的一排监狱里。如果相邻两个人宗教信仰相同,则会发生越狱。问有多少情况会发生越狱?答案mod 100003。
解题思路:每个人有m种可能的宗教信仰,有n个人,则有$m^n$种情况。
不能越狱则需要两个相邻的宗教信仰不同,则除了第一个有m种可能外,其他都只有m-1种,因为要和前一个不同。
则一共有$m(m-1)^{n-1}$种情况。
则用总情况减去不越狱情况即可,即答案为$[m^n-m(m-1)^{n-1}]\mod 100003$。
计算用快速幂即可。
时间复杂度$O(\log_2 n)$。
C++ Code:
#include<iostream> #define ll long long #define md 100003 ll n,m; ll pow(ll a,ll b){ ll l=1; while(b){ if(b&1)l=l*a%md; a=a*a%md; b>>=1; } return l; } int main(){ std::ios::sync_with_stdio(0); std::cin>>m>>n; m%=md; std::cout<<(pow(m,n)-pow(m-1,n-1)*m%md+md)%md<<‘\n‘; return 0; }
标签:相同 复杂度 快速幂 with 不能 第一个 define turn 不同
原文地址:http://www.cnblogs.com/Mrsrz/p/8005093.html