【简单组合数学】bzoj1008 越狱

来源:互联网 发布:天津大学仁爱学院知乎 编辑:程序博客网 时间:2024/06/06 00:54

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1008
题目大意:n名犯人m种宗教,关进n个笼子里(监禁play),有多少种相同宗教犯人挨着的情况

组合数学的基本题

有相同宗教犯人相邻的方案数=总方案数-没有相同宗教犯人相邻的方案数

总方案数:
mn
没有相同宗教犯人相邻的方案数:
第一个牢房可以有m种放置方法,第二个不能和前一个一样,所以有(m-1)种,第三个不能和第二个一样,所以也是(m-1)种……
m(m1)n1

有相同宗教犯人相邻的方案数:
mnm(m1)n1

于是此题变成快速幂练习……

#include <iostream>#define ll long long#define MOD 100003llusing namespace std;ll m,n,ans1,ans2;ll js(ll p,ll x){    if(x == 0)        return 1;    if(x == 1)        return p % MOD;    ll w = js(p,x/2)%MOD;    if(x % 2 == 0)        return (w * w) % MOD;    else        return (((w * w) % MOD) * p)% MOD;}int main(){    cin >> m >> n;    ans1 = js(m,n);    ans2 = m * js(m-1,n-1) % MOD;    if(ans1 - ans2 < 0)        ans1 += MOD;    cout << ans1-ans2 << endl;    return 0;}
0 0
原创粉丝点击