【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;
}

  

原文地址:https://www.cnblogs.com/yangjiyuan/p/5320401.html