zoukankan      html  css  js  c++  java
  • 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
    ",r);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    CocoaPods
    第一篇 理论 1.7 精进-正念-正知,如理作意和觉察力
    构架稳定与可扩展的优惠券系统
    一个产品从0到1的过程
    实现实时定位
    征信比拼重点是数据和连接
    黑产
    爬虫有什么用
    爬虫应用
    甘蔗理论
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4004258.html
Copyright © 2011-2022 走看看