比赛: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;
}
posted @ 2021-08-18 21:57  ssl_lhj  阅读(29)  评论(0)    收藏  举报