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种.... 恰好出现k-1种

我们本来是要求 恰好用k的种 现在又要求恰好出现k-1种
那么就是 (k-1)*(k-2)^(n-1) 然后这个也是多算了一些情况的
以此类推 然后就可以用容斥原理

比如有5种颜色,选4种 就是

C(5, 4) * (C(4, 4)*4*3^4 - C(4, 3)*3*2^4 + C(4, 2)*2*1^4)

Sample Input

2
3 2 2// n m k
3 2 1
Sample Output

Case #1: 2
Case #2: 0

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <string>
# include <cmath>
# include <queue>
# include <list>
# define LL long long
using namespace std ; const int MOD = ; int n , m , k ;
LL CM ;
LL CK[] ;
LL INV[] ; LL pow_mod(LL p, LL k)
{
LL ans = ;
while(k) {
if (k & ) ans = ans * p % MOD;
p = (LL)p*p % MOD;
k >>= ;
}
return ans;
} LL Ext_gcd(LL a,LL b,LL &x,LL &y){ //扩展欧几里德
if(a==&&b==) return -;
if(b==) { x=, y=; return a; }
LL d= Ext_gcd(b,a%b,y,x);
y-= a/b*x;
return d;
}
//ax = 1(mod m)
LL Inv(LL a,LL m){ //求逆元 a对m的逆元
LL d,x,y,t = m;
d= Ext_gcd(a,t,x,y);
if(d==) return (x%t+t)%t;
return -;
} LL Cm(LL n, LL m, LL p) //求组合数
{
LL a=, b=;
if(m>n) return ;
while(m)
{
a=(a*n)%p;
b=(b*m)%p;
m--;
n--;
}
return (LL)a*Inv(b,p)%p; //(a/b)%p 等价于 a*(b,p)的逆元
} int Lucas(LL n, LL m, LL p) //把n分段递归求解相乘
{
if(m==) return ;
return (LL)Cm(n%p,m%p,p)*(LL)Lucas(n/p,m/p,p)%p;
} void init()
{
INV[] = ;
int i ;
for (i = ; i < ; i++)
INV[i] = Inv(i,MOD) ;
} int main()
{
//freopen("in.txt","r",stdin) ;
int T ;
scanf("%d" , &T) ;
int Case = ;
init() ;
while(T--)
{
Case++ ;
scanf("%d%d%d" , &n , &m , &k) ;
if (n == )
{
printf("Case #%d: %d\n", Case , m);
continue ;
}
int i ;
CM = Cm(m,k,MOD) ;
CK[] = ;
for (i = ; i <= k ; i++)
CK[i] = (CK[i-] * (k-i+)%MOD * INV[i])%MOD ;
LL ans = , t = ;
for (i = k ; i >= ; i--)
{
ans = (ans + t*CK[i]*i%MOD*pow_mod(i-,n-)%MOD+MOD)%MOD ;
t *= - ;
}
printf("Case #%d: %I64d\n",Case,ans*CM%MOD); }
return ;
}

CF GYM100548 (相邻格子颜色不同的方案数 2014西安现场赛F题 容斥原理)的更多相关文章

  1. P1108 低价购买——最长下降子序列+方案数

    P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ...

  2. CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)

    1.http://codeforces.com/problemset/problem/149/D 2.题目大意 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色, ...

  3. poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)

    N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余 Sample Input 212Sample Output 2//(蓝,黄)6//( ...

  4. CodeForces - 1093D:Beautiful Graph(二分图判定+方案数)

    题意:给定无向图,让你给点加权(1,2,3),使得每条边是两端点点权和维奇数. 思路:一个连通块是个二分图,判定二分图可以dfs,并查集,2-sat染色. 这里用的并查集(还可以带权并查集优化一下,或 ...

  5. codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。

    限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...

  6. poj3254 Corn Fields 利用状态压缩求方案数;

    Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10658   ...

  7. 【CodeChef】KNGHTMOV(方案数DP)

    题意: 考虑一张无限大的方格棋盘.我们有一个“骑士”,它必须从(0,0)格开始,按照如下规则,移动至(X,Y)格:每一步,它只能从(u,v)格移动至(u+Ax,v+Ay)或者(u+Bx,v+By).注 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. Java基础-方法(method)的应用

    Java基础-方法(method)的应用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 方法就是定义在类中,具有特定功能的一段小程序,方法也称为函数(function),方法可以接 ...

  2. List保存在ViewState

    private List<SYSUAO> UserRoleList { get { return ViewState["UserRoleList"] as List&l ...

  3. MongoDB 数据迁移和同步

    MongoDB 数据迁移和同步 MongoDB的数据同步 复制 mongodb的复制至少需要两个实例.其中一个是主节点master,负责处理客户端请求,其余的都是slave,负责从master上复制数 ...

  4. 51 nod 1058 N的阶乘的长度

    1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3.   In ...

  5. PIE的使用

    实际上是指的是一个名为pie的htc文件,即pie.htc,使用CSS的behavior行为,可以调用此文件,然后让IE也能实现一些常见的 CSS3效果,如圆角(border-radius),盒阴影( ...

  6. Session详解、ASP.NET核心知识(8)

    介绍一下Session 1.作用 Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session). 在本篇博文的姊妹篇 ...

  7. 天梯赛 L2-007. (并查集) 家庭房产

    题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...

  8. Linux基础-yum软件包管理

    任务目标:自定义yum仓库:createrepo,自定义repo文件,使用yum命令安装httpd软件包,卸载httpd软件包:yum –y remove 软件名 ,使用yum安装组件'KDE 桌面' ...

  9. VC++的全局变量(转)

    全局变量一般这样定义:1.在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt:这样就可以用了. 2.在stdafx.cpp中加入:int my ...

  10. for-of循环和for-in循环的区别

    基本上for in用于大部分常见的由key-value对构成的对象上以遍历对象内容. 但是for in在遍历数组对象时并不方便,这时候用for of会很方便.