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)


相关推荐

  • USB转RS485串口电路设计「建议收藏」

    USB转RS485串口电路设计「建议收藏」USB转串口芯片的串口信号一般为TTL/CMOS电平,在实现半双工RS485串口时需要外接485电平转换芯片,设计中需要有信号来控制485转接芯片的发送和接收使能端,建议选择自带485控制引脚的转接芯片(如CH340/CH342系列芯片的TNOW引脚),该引脚默认为低电平,当串口处于发送状态时会自动拉高处于有效状态,发送完成再恢复低电平。同理,可以延伸到其他应用场景,如单片机串口转485电路设计中可以使用GPIO口来控制485转接芯片的发送和接收使能。以MAX485为例:1.DE..

  • maven配置阿里云仓库地址

    maven配置阿里云仓库地址<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexusaliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>

  • RegisterStartupScript的使用方法「建议收藏」

    RegisterStartupScript的使用方法「建议收藏」Asp.net中RegisterStartupScript方法的使用:MSDN如下说:允许 ASP.NET 服务器控件在 Page 中发出客户端脚本块。[Visual Basic]PublicOverridableSubRegisterStartupScript(_   ByVal key As String,_   ByVal script As String

  • rgbd slam_深度感知摄像头

    rgbd slam_深度感知摄像头‘’工欲善其事必先利其器‘’我们先从能够获取RGBD数据的相机开始谈起。首先我们来看一看其分类。一、根据其工作原理主要分为三类:1.双目方案:(1)原理:http://blog.csdn.net/shenziheng1/article/details/52883536(2)产品:ZED:https://www.stereolabs.com/Tango:http://

  • linux修改密码后登陆失败_linux取消root密码

    linux修改密码后登陆失败_linux取消root密码问题:当使用root修改密码时,报错passwd:Authenticationtokenmanipulationerror解决:1、查看是否权限问题,/etc/passwd/etc/shadow文件是否被锁住lsattr/etc/passwdlsattr/etc/shadow文件解锁:chattr-i/etc/passwdchattr-i/etc…

  • 【python】分苹果

    【python】分苹果问题:一堆苹果,5个人。第一个人将苹果丢掉一个,然后平均分成5份后拿走其中的一份;第二个人将剩余的苹果丢掉一个,然后再平均分成5份后拿走其中的一份,依次类推…第五个人在第四个人拿走剩下的那部分苹果中同样丢掉一个,然后平均分成5份后拿走其中的一份。求问最少的苹果数。depth=0defmatch(num):””””””globaldepth…

发表回复

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

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