为了防止我做的题又突然变成权限题,我还是直接复制下来吧
1008: [HNOI2008]越狱
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6338 Solved: 2707
[ Submit][ Status][ Discuss]
Description
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
Output
可能越狱的状态数,模100003取余
Sample Input
2 3
Sample Output
6
HINT
6种状态为(000)(001)(011)(100)(110)(111)
这道题又是一道简单的数学组合+快速幂
首先假设只有一个房间,那么共有m种方法
再增加一个房间时,该房间有 M-1 种方法,即有ans=M*(M-1)
同理可以增加到底n间房子,则有M*(M-1)^(N-1)种方法可以使犯人不越狱
然后很容易知道所有的可能宗教信仰方案为:M^N
所以答案是 M^N-M*(M-1)^(N-1)
(当然可别忘了快速幂)
下面附上代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int mm=100003;
typedef long long ll;
ll n,m;
ll power(ll a,ll b)//快速幂a^b
{
ll t=1;
while(b!=0)
{
if(b%2)t=t*a%mm;
a=a*a%mm;
b/=2;
}
return t;
}
int main()
{
scanf("%lld%lld",&m,&n);
ll ans=power(m,n);
ans=(ans+mm-(m*power(m-1,n-1))%mm)%mm;//记住一定要在计算时加上一个100003,否则答案为负。
printf("%lld\n",ans);
return 0;
}
如果算法还有优化的地方,请各位过路大神指导……