【简单组合数学】bzoj1008 越狱

题目链接: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 100003ll
using 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值