题目描述
有n个点,每个点一种颜色,一共有m种颜色,求相邻点存在相同颜色的状态数,并对100003取余
样例输入
2 3
样例输出
6
思路
先求出所有状态数
m
n
m^n
mn
然后减去所有没有相邻点不存在相同颜色的状态数:
第一个点有
m
m
m个选择,往后的
n
−
1
n-1
n−1个人则都有
m
−
1
m-1
m−1种选择
总数为
m
∗
(
m
−
1
)
n
−
1
m * (m - 1) ^ {n - 1}
m∗(m−1)n−1
则答案为
m
n
−
m
∗
(
m
−
1
)
n
−
1
m ^ n - m * (m - 1) ^ {n - 1}
mn−m∗(m−1)n−1
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const ll mo = 1e5 + 3;
ll n, m, Ans, t;
ll power(ll a, ll b)
{
ll Ans = 1;
a = a % mo;
while(b)
{
if(b & 1) Ans = (ll) Ans * a % mo;
a = (ll)a * a % mo;
b >>= 1;
}
return Ans;
}
int main()
{
scanf("%lld%lld", &m, &n);
ll sum = power(m, n) % mo;
ll num = power(m - 1, n - 1);
Ans = sum - m * num;
while(Ans < 0)Ans += mo;
printf("%lld", Ans);
return 0;
}