本文主要是介绍1008: [HNOI2008]越狱(排列组合),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input
输入两个整数M,N.1<=M<=108,1<=N<=1012
Output
可能越狱的状态数,模100003取余
Sample Input
2 3
Sample Output
6
HINT
6种状态为(000)(001)(011)(100)(110)(111)
Source
思路: 所有组合是m^n,不相邻的组合,第一个有m种,其他n-1个犯人各有m-1种。
所有的组合减去不相邻的组合就是答案。
#include <stdio.h>
#include <algorithm>using namespace std;typedef long long ll;
const int MOD = 100003;ll qpow(ll a,ll b)
{ll res = 1;while(b){if(b & 1)res = (res * a) % MOD;a = (a * a) % MOD;b >>= 1;}return res;
}int main()
{ll m,n;scanf("%lld%lld",&m,&n);printf("%lld\n",(qpow(m,n) - m * qpow(m - 1,n - 1) % MOD + MOD * 10) % MOD);return 0;
}
这篇关于1008: [HNOI2008]越狱(排列组合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!