2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)

2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)

大家好,又见面了,我是全栈君。

题目链接:传送门

题意:

n个格子排成一行。我们有m种颜色。能够给这些格子涂色,保证相邻的格子的颜色不同

问,最后恰好使用了k种颜色的方案数。

分析:

看完题目描写叙述之后立刻想到了一个公式 :C(m,k)*k*(k-1)^(n-1),可是细致分析了一下

这个公式的含义是相邻的格子颜色不同,使用的颜色总数小于等于k的方案数,可是这个

公式能够帮忙我们衍生出来以下的公式。C(k,x)*x*(x-1)^(n-1),这个公式的含义是在这

k种颜色中再选出来x种使得相邻的格子不同色最后的颜色数小于等于x,然后每个集合

都有交们我们能够考虑用容斥来搞一下。

设 S = F[x]=C(k,x)*x*(x-1)^(n-1);

ans = C(m,k) * sigma{ (-1)^(k-i) * C(k,i) * i *(i – 1)^(n-1)} (1 <= i <= k)

代码例如以下:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

typedef long long LL;

const LL mod = 1e9+7;

const int maxn = 1e6+10;

LL n,m,k;

LL c[maxn],inv[maxn];

LL quick_mod(LL a,LL b){
    LL ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans ;
}

inline LL get_inverse(LL x){ //(a/b) % c = a*inv[b] %c if(c is a prime number) inv[b] = (b^(c-2))%c;
    return quick_mod(x,mod-2);
}

void init(){//将[1,1e6+10]的逆元预处理出来
    for(LL i=1;i<maxn;i++)
        inv[i]=get_inverse(i);
}

void get_combine(LL n){//得到组合数
    c[0]=1;
    for(LL i=1;i<=k;i++){
        c[i]=(c[i-1]*(n-i+1)%mod)*inv[i]%mod;
    }
}

inline LL calc(LL x){// x*C(k,x)*(x-1)^(n-1)
    return (c[x]*x%mod)*quick_mod(x-1,n-1)%mod;
}

int main(){
    init();
    int t,cas=1;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld",&n,&m,&k);
        get_combine(m);
        LL ans = c[k],ans1=0,tag=1;
        get_combine(k);
        for(LL i=k;i>=1;i--){
            ans1=(ans1+tag*calc(i)+mod)%mod;
            tag=-tag;
        }
        ans=ans*ans1%mod;
        printf("Case #%d: %lld\n", cas++, ans);
    }
    return 0;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116496.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hibernate id 生成器「建议收藏」

    hibernate id 生成器「建议收藏」hibernateid生成器1、identity:用于MySql数据库。特点:递增 ..    .注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。 2、sequence:用于Oracle数据库 ..   .     序列名.   .3、native:跨数据库时使用,由底层方言产生

    2022年6月21日
    31
  • 弗洛伊德算法—–最短路径算法(一)

    弗洛伊德算法—–最短路径算法(一)学习此算法的原因:昨天下午遛弯的时候,碰到闺蜜正在看算法,突然问我会不会弗洛伊德算法?我就顺道答应,然后用了半个小时的时间,学习了此算法,并用5分钟讲解给她听,在此也分享给各位需要的朋友,让你们在最短的时间内,透彻的掌握该算法。RobertW.Floyd(罗伯特弗洛伊德)1962年在“CommunicationoftheACM”上发表了该算法,同年StephenWarsha…

    2022年6月4日
    386
  • 最常用Python开源框架有哪些?

    最常用Python开源框架有哪些?

    2021年10月11日
    93
  • coolfire黑客入门教程系列之(八)最后部分!

    coolfire黑客入门教程系列之(八)最后部分!作者glayjun@2005-06-0309:46:25我将coolfire黑客入门教程系列之(八)这篇教程为开了三部分!!这是最后的部分!!不要再问我coolfire是谁啊!!!呵呵!!我怕!!林正隆,中国台湾著名黑客,中国黑客领军人物。2011年获得COG信息安全终身成就奖林正隆-百度百科说明:本系列文章是整理Coolfire的8篇黑客入门文章,因在浏览网上相关文章的时候,要…

    2022年5月31日
    39
  • shell循环做数字递增

    shell循环做数字递增在shell用for循环做数字递增的时候发现问题,特列出shell下for循环的几种方法:1.foriin`seq11000000`;doecho$idone用seq110000000做递增,之前用这种方法的时候没遇到问题,因为之前的i根本就没用到百万(1000000),因为项目需要我这个数字远大于百万,发现用seq…

    2022年7月24日
    35
  • 一元线性回归方程公式_用普通最小二乘法估计经典线性模型

    一元线性回归方程公式_用普通最小二乘法估计经典线性模型概述别看公式多,其实很简单最小二乘法其实又叫最小平方法,是一种数据拟合的优化技术。实质上是利用最小误差的平方寻求数据的最佳匹配函数,利用最小二乘法可以便捷的求得未知的数据,起到预测的作用,并且是的这些预测的数据与实际数据之间的误差平方和达到最小。一般应用在曲线拟合的目的上。原理本篇文章不考虑其他方面的应用,我们用最简单的实例说明最小二乘法的工作原理与其内在含义。当我们在研究两个…

    2025年6月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号