【HNOI2009】【BZOJ1008】越狱(组合,方案数,水题)

problem

  • 有N个监狱(每个监狱一个犯人),编号1~N; 每个犯人有1种宗教信仰,编号1~M。
  • 相邻房间的人如果信仰相同,就会越狱。
  • 求可能发生越狱的方案数%100003。

solution

一、题解

  • 考虑用总方案数减去不会越狱的方案数:
  • 有m种信仰,n个监狱,那么总共有m^n的种方案数
  • 不会越狱的方案数是m(m1)n1。(这是因为第2~n个犯人信仰的宗教需要和上一个人不一样)

二、注意:

  • 最后快速幂复杂度logn可水。
  • 以及,记得开long long。
  • 直接减有可能出现负数,所以得加上一个mod再减。

codes

#include<iostream>
#define mod 100003
using namespace std;
typedef long long LL;
LL pow(LL a, LL b){
    if(!b)return 1;
    LL t = pow(a, b/2)%mod;
    return b%2==0 ? t*t%mod : t*t*a%mod;
}
int main(){
    LL m, n;  cin>>m>>n;
    cout<<(pow(m,n)%mod-m*pow(m-1,n-1)%mod+mod)%mod<<"\n";
    return 0;
}
posted @ 2018-05-25 13:17  gwj1139177410  阅读(114)  评论(0编辑  收藏  举报
选择