BZOJ 1008 [越狱]

题面

题意

  对所有长度为 \(n\),值域为 \(1 \sim m\) 的序列,求其中满足存在两个相邻元素相等的序列个数。对 \(100003\) 取余。

题解

  转换思路,求有多少序列不满足限制。要让序列相邻元素都不相等,确定了第一个元素的值,之后每一个元素只要不与上一个元素相同就可以,也就是说除了第一位,剩下 \(n-1\) 位都有 \(m-1\) 种取法,所以有 \(m(m-1)^{n-1}\) 个不满足要求的序列。序列总数是 \(m^n\),答案是 \(m^n-m(m-1)^{n-1}\)。用快速幂求值。

代码

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=1e5+3;
ll qpow(ll a,ll b){
    ll ans=1;
    while (b){
        if (b&1) ans=ans*a%mod;
        a=a*a%mod; b>>=1;
    }
    return ans;
}
int main(){
    ll n,m,ans;
    scanf("%lld%lld",&m,&n);
    ans=(qpow(m,n)-m*qpow(m-1,n-1))%mod;
    printf("%lld\n",(ans+mod)%mod);
    return 0;
}
posted @ 2019-12-13 10:06  Kilo-5723  阅读(92)  评论(0)    收藏  举报