越狱

滴答滴答---题目链接 

  •   监狱有连续编号为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)
  1. 这题不是很难。统计可能越狱的状态是很难的,但是不越狱的状态是可以统计出来的。
  2. 第一个人可以任意选择宗教,后面的n-1个人每个人都只有m-1个宗教可以选择(不能跟他们前面的一样),所以,不越狱的状态数是m*(m-1)^(n-1)
  3. 总状态数是m^n,所以答案就是:ans=m^n-m*(m-1)^(n-1)
  4. 用快速幂可以轻松水过
  5. 下面贴代码
  • #include<iostream>
    using namespace std;
    typedef long long ll;
    int mod=100003;
    ll pow(ll x,ll n)
    {
        ll res=1;
        while(n>0)
        {
            if(n&1)
                res=res*x%mod;
            x=x*x%mod;
            n>>=1;
        }
        return res;
    }
    int main()
    {
        long long m,n;
        cin>>m>>n;
        long ans;
        ans=((pow(m,n)%mod)-(m%mod)*(pow(m-1,n-1)%mod)%mod)%mod;
        if(ans<0)ans+=mod; //最后得注意,由于是取模后减的,所以可能减出负数,这边就得处理一下了
        cout<<ans<<endl;
        return 0;
    }
    

     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值