UvaLive 7040-Color

分析:  用容斥来求。
          公式: C(m,k)*(k*(k-1)^(n-1) – C(k,k-1)*(k-1)*(k-2)^(n-1) + C(k,k-2)*(k-2)*(k-3)^(n-1)……. );
          解释: C(m,k):m种颜色中选k种。k*(k-1)^(n-1): 至多有不超过k中颜色且相邻两种颜色不同的填法。

 

/* ***********************************************
Author        :DarkTong
Created Time  :2016/5/31 18:52:26
File Name     :ff.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const int maxn = 1000000 + 10;
ll fac[maxn], Inv[maxn], Qui[maxn];

ll qui(ll x, ll n)
{
    if(n==0) return 1;
    if(x==0) return 0;
    ll ans = 1;
    while(n)
    {
        if(n&1) ans=ans*x%MOD;
        x=x*x%MOD;
        n>>=1;
    }
    return ans;
}
ll inv(ll x)
{
    return qui(x, MOD-2);
}
void init()
{
    fac[0]=Inv[0]=1;
    for(int i=1;i<maxn;++i)
    {
        fac[i]=fac[i-1]*i%MOD;
        Inv[i]=inv(fac[i]);
    }
}
ll Cnm(ll n, ll m)
{
    if(n<maxn) return fac[n]*inv(fac[n-m]*fac[m]%MOD)%MOD;
    ll a1 = 1, a2=1;
    for(ll i=n,j=1;j<=m;++j,--i)
    {
        a1=a1*i%MOD;
        a2=a2*j%MOD;
    }
    return a1*inv(a2)%MOD;
}
ll cnm(ll n, ll m)
{
//    return fac[n]*(inv(fac[m])*inv(fac[n-m])%MOD)%MOD;
    return fac[n]*(Inv[m]*Inv[n-m]%MOD)%MOD;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    init();
    int ca=1,tt;
    scanf("%d", &tt);
    while(ca<=tt)
    {
        ll n, m, k;
        scanf("%lld%lld%lld", &n, &m, &k);
        ll sum = k*qui(k-1, n-1)%MOD;
        for(int i=k-1,d=-1;i>=1;--i,d=-d)
        {
            ll s1 = (cnm(k, i)*i)%MOD*qui(i-1, n-1)%MOD;
            sum = ((sum+d*s1)%MOD+MOD)%MOD;
        }
        sum = sum*Cnm(m, k)%MOD;
        printf("Case #%d: %lld\n", ca++, sum);
    }

    return 0;
}
时间: 2024-10-09 06:12:50

UvaLive 7040-Color的相关文章

UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)

题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m 与后面的讨论分离.从m 种颜色中取出k 种颜色涂色,取色部分有C(m, k) 种情况: 然后通过尝试可以发现,第一个有k种选择,第二个因不能与第一个相同,只有(k-1) 种选择,第三个也只需与第二个不同,也有(k-1) 种选择.总的情况数为k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总

组合数+容斥原理 UVALive 7040 Color(14西安F)

题目传送门 题意:n盆花涂色,相邻不能涂相同的颜色,从m中颜色选取k种颜色涂,保证正好有k种颜色 分析:从m中颜色选取k种就是C (m, k),然后第一个有k种选择,之后的都有k-1种选择,这样是不超过k种颜色的方案,那么减去少了Ai颜色的方案数,用容斥原理,最后答案是C(m,k) × ( k × (k-1)^(n-1) + ∑((-1)^p × C(k, p) × p × (p-1)^(n-1) ) (2 <= p <= k-1): #include <cstdio> #incl

UVALive 4025 Color Squares(BFS)

题目链接:UVALive 4025 Color Squares 按题意要求涂色,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么东西,训练结束补的.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define CLR(a, b) memset((a),(b),sizeof

UVA1625 / UVALive 5841 Color Length DP

简单DP,dp[i][j]表示从第一个序列里取出i个和从第j个序列里取出j个的组合的最小值,可以从两个方向转移过来,每次转移加上已经出现过的且还没有出现完的字母的个数. O(n?m)的复杂度. 1625 Color Length Cars painted in different colors are moving in a row on the road as shown in Figure 1. The color of each car is represented by a single

Uva 7040 color(组合数)

题意:n个球有m种颜色可选,使用k种不同的颜色,求方案数: 思路:Cm[k]表示m中选k,方案数为Cm[k]*(k*(k-1)^(n-1)-sigma(p*(p-1)^(n-1))(1<=p<k)); #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MOD 1000000007 int t,n,m,k; long long ck[50001

组合数取模(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/52553048 0. 写在前面 在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题.以下部分内容改编自AekdyCoin的<组合数求模>,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同.另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fot

Color Length UVALive - 5841

题文:见网页:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3852,(紫书p276) 题解: 这个题目统计答案,或者说状态的转移十分巧妙,我们想如果设dp[i][j]表示一号串到了第i位,二号串到了第j位的最小话费,显然还要记一下最开始放入这个字母的位置,十分不好写对不对,并且也状压不下. 那么我们可以考虑,对于一个状态d

Color颜色对照表

Color.AliceBlue 240,248,255 Color.LightSalmon 255,160,122 Color.AntiqueWhite 250,235,215 Color.LightSeaGreen 32,178,170 Color.Aqua 0,255,255 Color.LightSkyBlue 135,206,250 Color.Aquamarine 127,255,212 Color.LightSlateGray 119,136,153 Color.Azure 240,

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre