题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1008
题目大意:n名犯人m种宗教,关进n个笼子里(监禁play),有多少种相同宗教犯人挨着的情况
组合数学的基本题
有相同宗教犯人相邻的方案数=总方案数-没有相同宗教犯人相邻的方案数
总方案数:
mn
没有相同宗教犯人相邻的方案数:
第一个牢房可以有m种放置方法,第二个不能和前一个一样,所以有(m-1)种,第三个不能和第二个一样,所以也是(m-1)种……
m∗(m−1)n−1
有相同宗教犯人相邻的方案数:
mn−m∗(m−1)n−1
于是此题变成快速幂练习……
#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;
}