codeforces 100548F (西安现场赛F题):容斥原理

题目大意:

对n个排成一排的物品涂色,有m种颜色可选。

要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数

分析:

从m种颜色中选出k种,有c(m,k)种方法,那么我们只用考虑 k种颜色的涂法即可

显然第一个物品有k种涂法,后面的因为不能跟前面的相同都只有k-1种涂法

因此容易想到一个公式:k*(k-1)^(n-1)

但是这个公式算的是 不超过k种颜色的涂法,题目要求必须k种,怎么办呢?

先考虑一个简化版的问题:

用而且用完5种颜色涂不相关的五个物品的方案数

用阶乘的方法可以算出 ans=120,换一种思路呢想一想这个问题,容易想到

ans(取五种颜色)=5^5(取不大于5种颜色)-c(5,4)*4^5(取不大于4种颜色)

可是一算发现ans竟然小于0了,这是怎么回事呢?容易发现其实取小于四种颜色的方案被减重复了

于是想到需要容斥

ans=c(5,5)*5^5-c(5,4)*4^5+c(5,3)*3^5-c(5,2)*2^5+c(5,1)*1^5 =120

这个问题解决了。原问题也就差不多了。。

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
const long long mod=1000000007;
const long long ny=500000004;
long long n,m,k;
long long cm[1000010];
long long cn[1000010];
long long ck[1000010];
long long inv[1000010];
long long mo(long long x)
{
    while(x<0)
        x+=mod;
    return x%mod;
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;
    if(b==0){x=1;y=0;return a;}
    long long d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
long long Inv(long long a,long long n)
{
    long long x,y;
    long long d=exgcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}
long long quickmod(long long a,long long b,long long m) //a^b%m
{
    long long res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}
void ini()
{
    cn[0]=cm[0]=1;
    memset(cm,0,sizeof(cm));
    cm[0]=1;
    int tmp=min(m/2,k);
    for(int i=1;i<=tmp;i++)
    {
        cm[i]=(cm[i-1]*(m+1-i)%mod*inv[i])%mod;
    }
    if(cm[k]==0)
        cm[k]=cm[m-k];
    ck[0]=ck[k]=1;
    for(int i=1;i<=k/2;i++)
    {
        ck[i]=(ck[i-1]*(k+1-i)%mod*inv[i])%mod;
        ck[k-i]=ck[i];
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    inv[1]=1;
    for(int i=2;i<=1000000;i++)
    {
        inv[i]=Inv(i,mod);
    }
    int t;
    scanf("%d",&t);
    int cas=0;
    while(t--)
    {
        cas++;
        scanf("%I64d%I64d %I64d",&n,&m,&k);
        ini();
        long long ans=0;
        long long p=1;
        for(int i=k;i>=1;i--)
        {
            ans=(ans+p*((ck[k-i])*i%mod*quickmod(i-1,n-1,mod)%mod)+mod)%mod;
            p=-p;
        }
        ans=(ans*cm[k])%mod;
        printf("Case #%d:%c%I64d\n",cas,‘ ‘,ans);
    }
    return 0;
}
时间: 2024-12-14 03:20:52

codeforces 100548F (西安现场赛F题):容斥原理的相关文章

2014西安现场赛F题 UVALA 7040

地址 题意:求在m种颜色中挑选k种颜色,给n个花朵涂色有几种方法. 分析:画图可以发现,基本的公式就是k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色:接着就是一个容斥问题,上述计算方法中包含了只含有2.3.….(k-1)种颜色的情况,需要通过容斥原理去除.假设出现p (2 <= p <= k-1)种颜色,从k种颜色中选取p种进行涂色,方案数为C(k,p) × p × (p-1)^(n-1) :总的方案数就是C(m,k) × ( k × (

CF GYM100548 (相邻格子颜色不同的方案数 2014西安区域赛F题 容斥原理)

n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m). m种颜色取k种 C(m, k) 这个可以放最后乘 那么问题就变成只用k种颜色第一个格子有k种涂法 第二个有k-1种 第三个也是k-1种 一共就是k*(k-1)^(n-1) 这种算法仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色 也就是多算了恰好出现2种 恰好出现3种...

HDU 4458 Shoot the Airplane (2012年杭州赛区现场赛F题)

1.题目描述:点击打开链接 2.解题思路:本题利用运动的相对性解决.可以假设飞机固定不动,那么子弹相当于还有一个水平分量,只不过方向是-v.这样,问题就转化为一个动点什么时候到达一个多边形内部的问题了.不过本题有一个细节就是g可能等于0,因此要分匀变速运动和匀速运动2种情况求出最大可能的子弹飞行时间.另外一个细节就是本题对精度要求比较高,建议判断点是否在线段上改为利用坐标的差值来判断,避开使用Dot函数. 3.代码: #include<iostream> #include<algorit

HDU 4791 Alice&#39;s Print Service(2013长沙区域赛现场赛A题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3...表示打印区间s1到s2张纸的单价是p1,打印区间s2 到s3的单价是p2....最后是sn到无穷大的单价是pn,让你求打印k张纸的总费用最少是多少?有m次查询. 因为s1*p1 > s2 * p2 > s3*p3......,很显然,加入k所在的那个区间是第x个区间,那么最低费用要么是k * p

HDUOJ-------2493Timer(数学 2008北京现场赛H题)

Timer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 445    Accepted Submission(s): 90 Problem Description Recently, some archaeologists discovered an ancient relic on a small island in the Pa

zoj 3819(牡丹江现场赛A题)

马上要去上海了,刷刷现场赛的题找找感觉~~~ 这题.......额,没什么好说的,太水.. ZOJ Problem Set - 3819 Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar University. He is clever and diligent. However, he is not good at math, especially in Mat

2013 ACM/ICPC 长沙现场赛 A题 - Alice&#39;s Print Service (ZOJ 3726)

Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using her print service found some tricks to save money. For example, the price when

HDU 4119 Isabella&#39;s Message (2011年成都赛区现场赛I题)

1.题目描述:点击打开链接 2.解题思路:本题是一道模拟题,要求模拟一个解密的过程,练习这么久第一次做模拟题1Y了,内心还是很激动的~.只需要根据题意,记录* 所在的位置即可,然后每次都是先解密,后顺时针旋转90度.把每次解密的信息放到一个vector里,接下来就是连接它们,得到解密后的字符串,在map中查找这些单词是否存在即可.如果都存在,就把这条解密信息放到ans中,最后对ans排序,输出ans[0]就是答案. 3.代码: //#pragma comment(linker, "/STACK:

HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)

A simple stone game                                                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)