一看还以为很难的样纸~~~
比较水了。还OI题- -
要求任意两个相邻,貌似很难算,还要容斥什么的- -
考虑设答案为集合A
总共的状态m^n,为集合U,A关于U的补集为B.
B就是任意两个不相邻。
第一个数选有m种,剩下n-1个数每个数和之前那个不一样就好了,每一个有m-1种。
B=m*(m-1)^(n-1)
然后A=U-B=m^n-M*(m-1)^(n-1)
快速幂就好了
PS:还是没有1A,忘记开long long 了,貌似炸了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cmath>
#define M 100003
#define LL long long
using namespace std;
/*
m^n-m*(m-1)^(n-1)
*/
LL n,m;
LL qk(LL x,LL y)
{
LL res=1;
while(y)
{
if(y&1)res=((res%M)*(x%M))%M;
y>>=1;
x=((x%M)*(x%M))%M;
}
return res;
}
int main()
{
scanf("%lld%lld",&m,&n);
LL k=qk(m,n);
LL q=qk(m-1,n-1);
LL ans=k-((m%M)*(q%M))%M;
ans=(ans%M+M)%M;
printf("%lld\n",ans);
return 0;
}