BZOJ 1008: [HNOI2008]越狱

传送门

基础容斥

不合法方案数 = 总方案数 - 合法方案数

合法方案数很好求

第一个位置有 m 种选法

第二个位置有 m-1 种选法(不能与第一个位置冲突)

第三个位置有 m-1 种选法(不能与第二个位置冲突)

......

除了第一个位置,其他每个位置有有 m-1 种选法

那么就是 $m*(n-1)^{(m-1)}$

总方案数显然为 $n^m$

注意,先读入 m 再读入 n ,坑了我好久

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int mo=100003;
ll n,m;
inline ll ksm(ll x,ll y)
{
    ll res=1;
    while(y)
    {
        if(y&1) res=res*x%mo;
        x=x*x%mo; y>>=1;
    }
    return res;
}
int main()
{
    m=read(); n=read();
    printf("%lld",(ksm(m,n)-(m*ksm(m-1,n-1))%mo+mo)%mo);
    return 0;
}

 

posted @ 2018-12-11 20:05  LLTYYC  阅读(55)  评论(0编辑  收藏