bzoj2839 集合计数

| F.A.Qs | Home | Discuss | ProblemSet | Status | Ranklist | Contest | 入门OJ | ModifyUser | Logout | 捐赠本站 |
|---|
2839: 集合计数
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 854 Solved: 470
Description
Input
Output
Sample Input
Sample Output
HINT
【样例说明】
假设原集合为{A,B,C}
则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB},{AC},{BC}
【数据说明】
对于100%的数据,1≤N≤1000000;0≤K≤N;
Source
答案就是交集至少为k - 至少为k+1......
我们先钦定k个元素,这是Cnk的。然后发现有2n-k个集合包含它,这些集合都可以选或不选,所以是22^(n-k)-1
然后我们发现还是有多算的,至少为j的元素多算了Cjk次,因为我们可以从这Cjk个方案中导出这一种。于是还要乘上这个系数。
那个2的连续阶乘,把上面的对phi(p)取模然后快速幂。
#include <cstdio>
const int MO = , phi = ;
const int N = ;
int f[N], pw[N], pww[N], fac[N], inv[N], invn[N];
inline int C(int n, int m) {
if(n < m || n < || m < ) return ;
return 1ll * fac[n] * invn[m] % MO * invn[n - m] % MO;
}
inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
}
int main() {
int n, k;
scanf("%d%d", &n, &k);
pww[] = pw[] = fac[] = inv[] = invn[] = ;
fac[] = inv[] = invn[] = ; pw[] = pww[] = ;
for(int i = ; i <= n; i++) {
fac[i] = 1ll * fac[i - ] * i % MO;
inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
invn[i] = 1ll * invn[i - ] * inv[i] % MO;
pw[i] = pw[i - ] * % MO;
pww[i] = pww[i - ] * % (phi);
}
int ans = ;
for(int i = k; i <= n; i++) {
int temp = 1ll * (qpow(, pww[n - i]) - ) * C(n, i) % MO * C(i, k) % MO;
if((i - k) & ) ans = (ans - temp) % MO;
else ans = (ans + temp) % MO;
}
printf("%d\n", (ans + MO) % MO);
return ;
}
AC代码
还可以用类似bzoj3622的方法,倒着逐步推出正确的结果。虽然会超时但是思想值得借鉴。
#include <cstdio>
const int MO = , phi = ;
const int N = ;
int f[N], pw[N], pww[N], fac[N], inv[N], invn[N];
inline int C(int n, int m) {
if(n < m || n < || m < ) return ;
return 1ll * fac[n] * invn[m] % MO * invn[n - m] % MO;
}
inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
}
int main() {
int n, k;
scanf("%d%d", &n, &k);
pww[] = pw[] = fac[] = inv[] = invn[] = ;
fac[] = inv[] = invn[] = ; pw[] = pww[] = ;
for(int i = ; i <= n; i++) {
fac[i] = 1ll * fac[i - ] * i % MO;
inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
invn[i] = 1ll * invn[i - ] * inv[i] % MO;
pw[i] = pw[i - ] * % MO;
pww[i] = pww[i - ] * % (phi);
}
int ans = ;
/*for(int i = k; i <= n; i++) {
int temp = 1ll * (qpow(2, pww[n - i]) - 1) * C(n, i) % MO * C(i, k) % MO;
if((i - k) & 1) ans = (ans - temp) % MO;
else ans = (ans + temp) % MO;
}*/
for(int i = n; i >= k; i--) {
f[i] = 1ll * (qpow(, pww[n - i]) - ) * C(n, i) % MO;
for(int j = i + ; j <= n; j++) {
f[i] -= 1ll * f[j] * C(j, i) % MO;
if(f[i] < ) f[i] += MO;
}
}
printf("%d\n", (f[k] + MO) % MO);
return ;
}
70分TLE代码
bzoj2839 集合计数的更多相关文章
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- bzoj2839 集合计数(容斥)
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 883 Solved: 490[Submit][Status][Discuss] ...
- bzoj2839 集合计数 组合计数 容斥原理|题解
集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...
- bzoj2839 集合计数(容斥+组合)
集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- BZOJ2839 集合计数 容斥
题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...
- BZOJ2839集合计数
题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~ ...
- BZOJ2839 : 集合计数 (广义容斥定理)
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
- 2019.02.09 bzoj2839: 集合计数(容斥原理)
传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk种方案 ...
随机推荐
- Day 4-10 logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- Python 中关于 round 函数的小坑
参考: http://www.runoob.com/w3cnote/python-round-func-note.html
- hadoop分布式系统架构详解
hadoop 简单来说就是用 java写的分布式 ,处理大数据的框架,主要思想是 “分组合并” 思想. 分组:比如 有一个大型数据,那么他就会将这个数据按照算法分成多份,每份存储在 从属主机上,并且在 ...
- TensorFlow总结
第一 基础 1. 定义变量 #定义维度为[2,3], 平均值为·1, 标准差为1,类型为float32,名称为w1的服从正态分布的变量 w1 = tf.Variable(tf.random_norma ...
- peewee 事物 回滚
peewee 事物 回滚 #!/usr/bin/env python # coding=utf-8 from peewee import * db = MySQLDatabase(host='123. ...
- java 运行 .jar 文件乱码
http://yang3wei.github.io/blog/2013/02/10/java-dfile-dot-encoding-equals-utf-8-gan-diao-luan-ma/ 启动时 ...
- ORACLE 增加两列字段
declare v_cnt number; V_SQL VARCHAR2 (500) := '';begin select count(*) into v_cnt from dual where ex ...
- How to remove tag on Github
git tag -d 22 git push origin :refs/tags/22
- bzoj5358
Problem A. 口算训练Input file: stdinOutput file: stdoutTime limit: 5 secondsMemory limit: 512 megabytes小 ...
- servlet篇 之 servlet概念及其功能实现
Servlet概念: 在JavaWeb中,把那些可以使用浏览器通过url的形式来访问的java类,叫做servlet. servlet就是java类中的一种,只不过这种java类有一个特殊的功能,就是 ...