Description
求n个数排成一行,每个数都在1~m范围内且相邻两个数至少有一组相同的方案数。
n<=10^12,m<=10^8
Solution
发现直接计算很麻烦。
正难则反,我们考虑用总数-不合法的方案数。
总数很显然是
mn
那么不合法的方案数就是
第一个位置可以有m种放法,然后其他的每个位置都不可以和前面的重复,就是
(m−1)n−1
然后就完了。最近好颓( ⊙ o ⊙ )!总是在刷水。。。
Solution
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mo=100000+3;
ll n,m;
ll mi(ll x,ll y) {
ll z=x;
for(y--;y;y/=2) {
if (y&1) (z*=x)%=mo;
(x*=x)%=mo;
}
return z;
}
int main() {
scanf("%lld%lld",&m,&n);
printf("%lld",(mi(m,n)-m*mi(m-1,n-1)%mo+mo)%mo);
}