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

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python提取字符串中的数字「建议收藏」

    python提取字符串中的数字「建议收藏」一、isdigit()函数isdigit()函数是检测输入字符串是否只由数字组成。如果字符串只包含数字则返回True否则返回False。dream=”123456″print(dream.isdigit())#返回:Truedream=”123abc456″print(dream.isdigit())#返回:Falsedream=’abcd’print(dream.isdigit())#返回:False二、filter()函数说明:filter()函

    2022年10月10日
  • java删除文件和文件夹[通俗易懂]

    java删除文件和文件夹[通俗易懂]packagetest816;importjava.io.File;/*****删除文件或目录**@authorkempE-mail:572068511@qq.com*@version2018-8-16*@seejava.lang.Class*@sinceJDK1.8*/publicclassDeleteFile…

  • JSP实用教程(基础入门教程)

    一、JSP技术概述  在Sun正式发布JSP(JavaServerPages)之后,这种新的Web应用开发技术很快引起了人们的关注。JSP为创建高度动态的Web应用提供了一个独特的开发环境。按照Sun的说法,JSP能够适应市场上包括ApacheWebServer、IIS4.0在内的85%的服务器产品。即使您对ASP”一往情深”,我们认为,关注

  • TD—SCDMA的系统帧结构_sdh帧结构

    TD—SCDMA的系统帧结构_sdh帧结构TD-SCDMA物理信道用4层结构:超帧、无线帧、子帧和时隙/码。一个超帧长720ms,由72个无线帧组成,每个无线帧长10ms。TD-SCDMA将每个无线帧分为两个5ms的子帧,每个子帧由长度675us的7个主时隙和3个特殊时隙组成。3个特殊时隙分别是下行导频时隙(DwPTS,75us)、上行导频时隙(UpPTS,125us)和保护时隙(G,75us)构成。在这7个主时…

  • 程序员为什么要写博客_程序员写文章赚钱

    程序员为什么要写博客_程序员写文章赚钱不是大牛就不能写博客了吗?几乎每一个程序员都听说过写博客有很多好处,但真的动手去写的却很少。其中有一个很重要的原因就是,有些人心里会认为:我不是大牛,写出来的博客没意义。有这种心理很正常,只是每个

  • propertydescriptor是用来干什么的_java读取property文件

    propertydescriptor是用来干什么的_java读取property文件PropertyDescriptor中文叫属性描述器,是jiavaJavaBean的内省与BeanUtils库JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(ValueObject),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。JavaJDK中提供了一套API用来访问某个属性的getter/setter方

发表回复

您的电子邮箱地址不会被公开。

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