题目大意
给出序列长度n和颜色数m,求出存在相邻元素颜色相同的染色方案数。
题解
正难反易
因为正向解决这个问题比较困难,所以我们可以将问题转化为求出不存在相邻元素颜色相同的染色方案数,然后用所有排列的情况减去。
对于序列中的每一个人,只要和前一个人的颜色不同就可以了,所以共有m-1种选择。对于第一个人无论选什么颜色都可以,那么就有m种选择。
所以ans=m^n-m*(m-1)^(n-1)。
代码
#include <cstdio>
#include <iostream>
using namespace std;
const int moder=100003;
int fstpow(int a,long long k) {
int val=1,base=a;
while(k) {
if(k&1) val=(1ll*val*base)%moder;
base=(1ll*base*base)%moder;
k>>=1;
}
return val;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int m; long long n;
scanf("%d%lld",&m,&n);
int lhs=fstpow(m,n), rhs=(1ll*m*fstpow(m-1,n-1))%moder;
int ans=lhs-rhs;
printf("%d\n",ans<0?ans+moder:ans);
return 0;
}