比赛:2021-08-09:D
题目大意
\(n\)个人排队打饭,假如相邻的人打的菜一样,就会影响彼此用餐的心情。求这个队伍中有人被影响心情的状态数,对\(100003\)取余。
题目分析
直接求怎么影响心情难度较大,我们可以反道而行之,求不合法的方案数即求有多少种方法可以不影响心情。
第一个人可以随便选,即可以选\(m\)种菜,后\(n-1\)个人每人都可以选与前面的人不一样的\(m-1\)种饭菜。所以不合法状态就是\(m*(m-1)^{n-1}\)而全部的状态数就是n个人都有\(m\)种选择,所以全部的状态数就是\(m^n\)。
综上,合法状态数=全部状态数-不合法状态数=\((m^n)-(m*(m-1)^{n-1})\)
\(Code\)
#include<iostream>
#include<cstdio>
#define inf 100003
#define ll long long
using namespace std;
ll ans,n,m;
ll ksc(ll a,ll b){
ll res(0);
while(b){
if(b&1) res=res+a%inf;
a=(a%inf+a%inf)%inf;
b>>=1;
}
return res;
}
ll ksm(ll a,ll b){
ll res(1);
while(b){
if(b&1) res=ksc(res,a)%inf;
a=ksc(a,a)%inf;
b>>=1;
}
return res;
}
ll ksm1(ll a,ll b){
ll res(1);
while(b){
if(b&1) res=ksc(res,a);
a=ksc(a,a);
b>>=1;
}
return res;
}
int main(){
scanf("%d%d",&m,&n);
ans=(ksm1(m,n)-(m%inf*ksm((m-1),(n-1))%inf)%inf)%inf;
printf("%d",ksm1(m,n));
return 0;
}