1618:越狱
【题目描述】
原题来自:HNOI 2008
监狱有连续编号为 1
到 n 的 n 个房间,每个房间关押一个犯人。有 m
种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。
【输入】
输入两个整数 m
和 n
。
【输出】
可能越狱的状态数,对 100003
取余。
【输入样例】
2 3
【输出样例】
6
【提示】
样例说明
所有可能的 66 种状态为:{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}
。
数据范围与提示:
对于全部数据,1≤m≤108,1≤n≤1012
。
这道题比较巧妙,参考了数学中正难则反的思想(滑稽)。
因为直接求出答案个数显然难度较大我是直接放弃了
于是。。就逆向思考
首先让我们求出一共有几种可能:
一共有m种宗教和n个监狱,每一个监狱的犯人都可能有m种情况,显然,可能有m^n种情况
那么没有一人越狱的情况呢?
其实就是两两相邻的互不相同
#include<bits/stdc++.h> using namespace std; #define ll long long ll m,n; const ll M=100003; inline ll quickpow(ll x,ll y) { ll ans=1; while(y) { if(y&1LL) ans=ans*x%M; x=x*x%M; y>>=1; } return ans; } int main() { scanf("%lld%lld",&m,&n); if(n<2) { putchar('0');return 0; } printf("%lld\n",((quickpow(m,n)-m*quickpow(m-1,n-1)%M)%M+M)%M); return 0; }