bzoj1008 [HNOI2008]越狱

为了防止我做的题又突然变成权限题,我还是直接复制下来吧

1008: [HNOI2008]越狱

Time Limit: 1 Sec   Memory Limit: 162 MB
Submit: 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;
} 
如果算法还有优化的地方,请各位过路大神指导……
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值