组合数+容斥原理 UVALive 7040 Color(14西安F)
2024-08-30 13:43:56
题意: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>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int EPS = 1e-8;
int inv[N]; void init(int n) {
inv[1] = 1;
for (int i=2; i<=n; ++i) {
inv[i] = (MOD - MOD / i) * 1ll * inv[MOD%i] % MOD; //inv[n]
}
} int pow_mod(int x, int n, int p) {
int ret = 1;
while (n) {
if (n & 1) ret = ret * 1l * x % p;
x = x * 1ll * x % p;
n >>= 1;
}
return ret;
} int f(int n, int k) {
if (!k) return 0;
else return k * 1ll * pow_mod (k-1, n-1, MOD) % MOD;
} int main(void) {
init (1000000);
int T, cas = 0; scanf ("%d", &T);
while (T--) {
int n, m, k; scanf ("%d%d%d", &n, &m, &k);
ll ans = 0; int res = 1;
for (int i=1; i<=k; ++i) {
res = res * 1ll * (k - i + 1) % MOD * inv[i] % MOD;
if (k - i & 1) {
ans -= res * 1ll * f (n, i) % MOD;
if (ans < 0) ans += MOD;
}
else {
ans += res * 1ll * f (n, i) % MOD;
if (ans >= MOD) ans -= MOD;
}
}
for (int i=1; i<=k; ++i) {
ans = ans * 1ll * (m - i + 1) % MOD * inv[i] % MOD;
}
printf ("Case #%d: %lld\n", ++cas, ans);
} return 0;
}
最新文章
- Powershell 字符串处理案例
- MVC之权限管理-网站开发之路
- datatables.js 简单使用--多选框和服务器端分页
- sql where 1=1和 0=1 的作用
- Solr常用查询语法笔记
- 配置和使用buffer cache
- Kinetic使用注意点--layer
- ExtJs4.1实现数据缓存
- 几年的Git使用技巧总结
- 一步步教你使用rem适配不同屏幕的移动设备
- 高版本号chrome安装flashplayer debuger后无法使用的问题
- SmartSql 快速使用指南
- Linux - Linux 终端命令格式
- Tomcat8 启动慢 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [53,161] milliseconds
- vue2.0 --- vuex (一)
- python学习笔记五——数据结构
- 微信小程序开发(1) 天气预报
- PCL Save VTK File With Texture Coordinates 使用PCL库来保存带纹理坐标的VTK文件
- RVDS编译器
- 面试题20:搜索二叉树可能有两个元素发生了交换,如何恢复BST?