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

      

  • 相关阅读:
    HDU1266 Reverse Number
    codevs1380 没有上司的舞会
    codevs1163 访问艺术馆
    codevs2144 砝码称重 2
    codevs1553 互斥的数
    codevs1230 元素查找
    codevs3118 高精度练习之除法
    codevs1245 最小的N个和
    codevs1063 合并果子
    codevs1052 地鼠游戏
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5320401.html
Copyright © 2020-2023  润新知