[容斥原理] zoj 3556 How Many Sets I
主题链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?
problemId=4535
How Many Sets I
Time Limit: 2 Seconds Memory Limit: 65536 KB
Give a set S, |S| = n, then how many ordered set group (S1, S2, ..., Sk) satisfies S1 ∩ S2 ∩ ... ∩ Sk =
∅. (Si is a subset of S, (1 <= i <= k))
Input
The input contains multiple cases, each case have 2 integers in one line represent n and k(1 <= k <= n <= 231-1), proceed to the end of
the file.
Output
Output the total number mod 1000000007.
Sample Input
1 1
2 2
Sample Output
1
9
Author: QU, Zhe
Contest: ZOJ Monthly, October 2011
Submit
problemId=4535" style="color:blue; text-decoration:none">Status
题目意思:
已知|S|=n。给定k,求S1 ∩ S2 ∩
... ∩ Sk = ∅,当中Si是S的子集(i<=k)的种数。
n,k<=2^31-1
解题思路:
容斥原理
反向考虑。如果S1 ∩ S2 ∩
... ∩ Sk 不等于 ∅。则至少存在一个元素S1。S2。...,Sk都包括。
枚举都包括的元素.总的种数为(2^n)^k=2^(nk)
假设至少都包括一个元素,则种数为C(n,1)*(2^(n-1))^k=C(n,1)*2^((n-1)k)
假设至少都包括两个元素,则种数为C(n,2)*(2^(n-2))^k=C(n,2)*2^((n-2)k)
假设至少都包括i个元素,则种数为C(n,i)*(2^(n-i))^k=C(n,i)*2^((n-i)k)
减去包括一个的加上包括两个的减去包括3个的,如此类推。能够得出一下公式:
2^(nk)+C(n,1)*2^((n-1)k)-C(n,2)*2^((n-2)k)+...(-1)^i*C(n,i)*2^((n-i)k)+.....=(2^k-1)^n
(通过二项式公式)
所以答案转化为求(2^k-1)^n了,直接高速幂就可以。
代码:
//#include<CSpreadSheet.h> #include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; LL n,k; LL quick(LL a,LL b)
{
LL res=1; while(b)
{
if(b&1)
res=(res*a)%M;
b>>=1;
a=a*a%M;
}
return res;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%lld%lld",&n,&k))
{
LL ans=(quick(2,k)-1+M)%M; ans=quick(ans,n); printf("%lld\n",ans);
}
return 0;
}
最新文章
- Linux(十)___iptables防火墙
- iOS之设置头像(访问系统相册、本地上传)
- Linux中的命令 make -f 是什么意思
- socket初始
- JAVA 常用框架和工具
- html5新特性之拖放
- [stm32] STM32 Interrupts and events 系统了解(EXTI)及槽型光电开关tp850电路研究
- Vmware安装与VMware下Linux系统安装
- ubuntu14.04LS中安装SSH
- Educational Codeforces Round 15 套题
- uva 10366 Faucet Flow
- 汽车Vin码识别技术的由来到发展
- 最强PostMan使用教程(1)
- 04_Javascript初步第三天
- 原生javascript 的MAP使用
- PCB设计基本流程
- MUI手势锁
- 算法入门及其C++实现
- byte以及UTF-8的转码规则
- top 动态查看进程
热门文章
- [转]Linux(centOS6.5)下SVN的安装、配置及开机启动
- 关于负数的isdigit()判断
- awk 工具简介NF-NR
- 教你在mac上配置adb环境变量
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
- cairo graphics.org
- 泛虚拟化技术(以Xen为例)
- Android layoutInflate.inflate 方法具体解释,removeView()错误解决
- JSP 网页格式判定执行哪一块html
- winform 防止主界面卡死