【bzoj1008】[HNOI2008]越狱
这是一道数学题。属于排列组合问题。
题目抽象一下就是有n个格子,用m种颜色染色,求有两个相邻的同色的情况有多少种。
其实反过来考虑更好算。
总的方案数为mn,减去每个相邻的都不同色的情况既可。
考虑每个相邻的都不同色,第一个格子可以用m中,后面的每一个格子都只能用m-1中,所以就是m(m-1)n-1,最后的答案就是mn-m(m-1)n-1。
需要用到快速幂加同余。
注意减出来可能有负数,加上mod即可。
速度极快。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define MOD 100003 LL m,n; int qpow(LL a,LL b,LL c) { LL ans=1; LL k=a%c; while (b) { if (b&1) ans=1LL*ans*k%c; b>>=1; k=1LL*k*k%c; } return ans; } int main() { scanf("%lld%lld",&m,&n); LL ans=qpow(m,n,MOD); ans=(ans+MOD-m*qpow(m-1,n-1,MOD)%MOD)%MOD; printf("%lld",ans); return 0; }