题目传送门
看了数据范围马上想到组合了。。
一开始想直接求方案发现不行。
直接求方案的话应该要容斥原理去重。麻烦!
直接求方案不行就用总方案数-不会越狱的方案数不就完了咯。
总方案数貌似挺好求。
n个格子。每个格子m种选择。
那就是m的n次方。
因为n有点大。快速幂咯。
解决!
不会越狱的方案数。
第一个格子有m种选择。
那么第二种格子为了不跟第一个格子相同,所以有m-1种选择。
后面的格子为了不跟前一个格子相同,也都只有m-1种选择。
所以不会越狱的方案数等于m*(m-1)^(n-1)。
直接快速幂实现。
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=100003;
ll pow_mod(ll a,ll b) { //快速幂
ll ans=1;a%=mod;
while(b!=0) {
if(b%2==1)
ans=(ans*a)%mod;
b/=2;a=(a*a)%mod;
}
return ans;
}
int main() {
ll m,n;scanf("%lld%lld",&m,&n );
printf("%lld\n",(((pow_mod(m,n)-(m*pow_mod(m-1,n-1))%mod))%mod+mod)%mod);
return 0;
}
如果你还往下滚了。
有个要注意的地方:
虽然总方案数一定大于不会越狱的方案数。
但是模了之后就不一定了。
减出来有可能等于负数。要把它转正。
一个负数的转正方法:
(A+mod)%mod(这里mod代表模的数,A代表原数)