zoukankan      html  css  js  c++  java
  • BZOJ1008: [HNOI2008]越狱

    【传送门:BZOJ1008 


    简要题意:

      有n个格子,每个格子里有且只有一个球,有m种颜色,每个球都有颜色,求出有相邻的格子的两个球为相同颜色的情况数


    题解:

      就是一个组合数学,很容易就能想到把随便放的所有情况减去所有相邻格子都不同的情况就是答案了,那么怎么求呢?

      先求出n个格子随便放m种颜色球的情况数就是m^n(n个m相乘,因为可以很多球是相同颜色的)

      接下来就是要求所有相邻格子都不同的情况

      第一个格子假如放了1号颜色的球,那么第二个格子就会有m-1种选择,到第二个格子的时候,第三个格子就只有m-2种选择?错!!还是有m-1种选择,因为我们只是要求相邻的格子的球颜色不相同,所以第三个格子只需要选择与第二个格子不相同的颜色的球就可以了

      以此类推,因为第一个格子无论选什么对后面都没影响,所以所有相邻格子都不同的情况数就是(m-1)^(n-1)

      答案就是m^n-(m-1)^(n-1)

      但是还没有完,因为常数n,m很大,而且答案要mod100003,所以我们用快速幂来处理答案


    参考代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long LL;
    LL q_mod(LL a,LL b)
    {
        LL ans=1;a=a%LL(100003);
        while(b)
        {
            if(b&1) ans=(ans*a)%LL(100003);
            b>>=1;a=a*a%LL(100003);
        }
        return ans;
    }
    int main()
    {
        LL n,m;
        scanf("%lld%lld",&m,&n);
        LL s=(q_mod(m,n)%LL(100003)-m*q_mod(m-1,n-1)%LL(100003)+LL(100003))%LL(100003);
        printf("%lld",s);
        return 0;
    }

     

    渺渺时空,茫茫人海,与君相遇,幸甚幸甚
  • 相关阅读:
    jQuery技巧总结
    IBatis.NET框架
    武林足球Ajax全站的核心JS
    Lucene入门与使用(2)转
    图片预加载
    构建基于词典的Lucene分析器
    利用system表来注入
    查看执行后的HTML代码,方便调试
    每日英语
    关于URL的地址重写,自己也实验了一把!
  • 原文地址:https://www.cnblogs.com/Never-mind/p/7522720.html
Copyright © 2011-2022 走看看