ZOJ 3556

终于做出来了,激动。。。。

这道题隐藏得深啊,但若推导下来,就变简单了。

首先,一个集合的子集的个数为2^n=s。注意了,题目求的是有序集合组,并且每个集合是可以重复使用的,怎么办呢?这就要想到多重集合的排列问题了。

一个多重集合有k种元素,每种元素可以无限次使用,求r-排列个数。答案为 k^r个。

这样,我们使用容斥原理:

总个数为(2^n)^k个

包含一个元素的集合有序组为 C(n,1)(2^(n-1))^k

两个的为.....C(n,2)(2^(n-2))^k

。。。。

于是二项式定理+容斥原理公式化简即为(2^k-1)^n

#include <iostream>
#include <cstdio>
#include <algorithm>
#define MOD 1000000007
using namespace std;
typedef long long LL;

LL quick(LL a,LL b){
	a%=MOD;
	LL ans=1LL;
	while(b){
		if(b&1)
		ans=(ans*a)%MOD;
		b>>=1;
		a=(a*a)%MOD;
	}
	return ans;
}

int main(){
	LL n,k;
	while(cin>>n>>k){
		LL r=quick(2,k);
		r=((r-1)%MOD+MOD)%MOD;
		r=quick(r,n);
		printf("%lld\n",r);
	}
	return 0;
}

  

时间: 2024-10-10 20:51:45

ZOJ 3556的相关文章

[容斥原理] 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

【ZOJ 3556 How Many Sets I】

题目链接:题目 大概题意:有一个大集合S,里面有n(≤231-1)个元素,现在从中任意选出k(≤231-1)个子集组成一个有序集合对(S1,S2.....Sk),问其中有多少个集合对满足所有选出的子集的交集为空(S1 ∩ S2 .....Sk = Φ) 做法: 先说句废话. 首先要注意的是题目说所有的子集的交集为空集,不代表某两个子集之间交集一定为空.甚至有可能任意两个子集之间交集都不为空,但是所有子集之间的交集为空. 我当时想到这一点之后,就开始用排除法.即用全部减去不符合要求的.然后开始了漫

ZOJ 3556 How Many Sets I 二项式+容斥

n个元素的子集有2^n个 求从这些子集选出k个组成有序集 并且有序集的交集为空的方案数 总数为2^n^k 减去不符合的 不符合的为交集存在1个共同元素 存在2个共同元素.... 2^n^k-C(n, 1)*2^(n-1)^k+C(n, 2)*2^(n-2)^k.... (2^k-1)^n #include <cstdio> #include <cstring> using namespace std; typedef long long LL; //返回a^p mod n 快速幂

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

ZOJ 3607 Lazier Salesgirl (贪心)

Lazier Salesgirl Time Limit: 2 Seconds      Memory Limit: 65536 KB Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi. But she is so lazy

ZOJ - 2243 - Binary Search Heap Construction

先上题目: Binary Search Heap Construction Time Limit: 5 Seconds      Memory Limit: 32768 KB Read the statement of problem G for the definitions concerning trees. In the following we define the basic terminology of heaps. A heap is a tree whose internal n

ZOJ 2859 二维线段树

思路:自己写的第二发二维线段树1A,哈哈,看来对二维的push操作比较了解了:但是还没遇到在两个线段树中同时进行push操作的,其实这题我是想在x维和y维同时进行push操作的,但是想了好久不会,然后看到这题又给出10秒,然后想想在x维线段直接单点查询肯定也过了,然后在第二维就只有pushup操作,在第一维线段树没有pushup操作.要是在第一维也有pushup操作的话,那就不用单点查询那么慢了.不过也A了,想找题即在二维同时进行pushup和pushdown操作的. #include<iost