首页 > 其他 > 详细

P3197 [HNOI2008]越狱

时间:2018-05-28 18:19:50      阅读:230      评论:0      收藏:0      [点我收藏+]

题目描述

监狱有连续编号为 1…N 的 N 个房间,每个房间关押一个犯人,有 M 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

输入输出格式

输入格式:

输入两个整数 \(M,N\)

输出格式:

可能越狱的状态数,模 100003取余

输入输出样例

输入样例#1:

2 3

输出样例#1:

6

说明

6种状态为(000)(001)(011)(100)(110)(111)

1≤M≤108
1≤N≤1012

Solution

  这道题运用了正难反易的思想.  

  直接处理出合法的情况即可.

  然后想一想: 第一个有 n 种情况,然后的话 第二个就有 n-1 种情况.

  再依次类推,会发现,后面都是 n-1 种情况.

  所以 ans 即为:  \[m^n-n*(n-1)^{m-1}.\]

  套一个快速幂模板即可. 需要注意的是 ans 为负数的情况.

代码

#include<iostream> #include<cstdio>
using namespace std; 
long long n,m,p; 
long long quick_pow(long long s,long long ks)
{ if(ks==1)return s%p; long long k=s; ks--; while(ks>0)
    { if(ks%2==1)k=(k*s)%p;
        ks/=2;
        s=(s*s)%p;
    } return k%p;
} 
int main()
{
    cin>>n>>m;
    p=100003;
    cout<<(quick_pow(n,m)%p-n*quick_pow(n-1,m-1)%p+p)%p; 
    //需要处理负数的时候,加上一个 p再 模一个 p 即可 
    return 0;
}

P3197 [HNOI2008]越狱

原文:https://www.cnblogs.com/Kv-Stalin/p/9101490.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!