zoukankan      html  css  js  c++  java
  • Codechef CNTL Counting is life 生成函数

    传送门——Vjudge


    第一问很氵,如果(K,N)同奇偶就是(2^K-1),否则就是(2^K-2)

    第二问似乎是可重排列,考虑指数型生成函数。

    如何限制某些数必须要出现奇数/偶数次?考虑(frac{e^x-e^{-x}}{2}),可以发现它的展开式中只有次数为奇数的项有值,而(frac{e^x+e^{-x}}{2})只有次数为偶数的项有值。

    于是当(K,N)同奇偶时答案是(N!(frac{e^x-e^{-x}}{2})^K),否则是(N!(frac{e^x-e^{-x}}{2})^{K-1}frac{e^x+e^{-x}}{2})

    暴力二项式定理拆开((frac{e^x - e^{-x}}{2})^K)就可以算了。

    #include<iostream>
    #include<cstdio>
    //This code is written by Itst
    using namespace std;
    
    inline int read(){
    	int a = 0;
    	char c = getchar();
    	while(!isdigit(c))
    		c = getchar();
    	while(isdigit(c)){
    		a = a * 10 + c - 48;
    		c = getchar();
    	}
    	return a;
    }
    
    const int MOD = 1e9 + 7;
    inline int poww(long long a , int b){
    	int times = 1;
    	a = (a + MOD) % MOD;
    	while(b){
    		if(b & 1) times = times * a % MOD;
    		a = a * a % MOD;
    		b >>= 1;
    	}
    	return times;
    }
    
    const int MAXN = 1e5 + 7;
    int T , N , K , jc[MAXN] , inv[MAXN];
    
    void init(){
    	jc[0] = 1;
    	for(int i = 1 ; i <= 1e5 ; ++i)
    		jc[i] = 1ll * jc[i - 1] * i % MOD;
    	inv[100000] = poww(jc[100000] , MOD - 2);
    	for(int i = 1e5 - 1 ; i >= 0 ; --i)
    		inv[i] = inv[i + 1] * (1ll + i) % MOD;
    }
    
    int binom(int b , int a){
    	return b < a ? 0 : 1ll * jc[b] * inv[a] % MOD * inv[b - a] % MOD;
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
    	freopen("in","r",stdin);
    	//freopen("out","w",stdout);
    #endif
    	init();
    	for(T = read() ; T ; --T){
    		N = read(); K = read();
    		if((N ^ K) & 1){
    			cout << poww(2 , K) - 2 << ' ';
    			int ans = 0;
    			for(int i = 0 ; i < K ; ++i)
    				ans = (ans + (i & 1 ? -1ll : 1ll) * binom(K - 1 , i) * (poww(K - 1 - 2 * i + 1 , N) + poww(K - 1 - 2 * i - 1 , N)) % MOD + MOD) % MOD;
    			cout << 1ll * ans * poww(poww(2 , K) , MOD - 2) % MOD << '
    ';
    		}
    		else{
    			cout << poww(2 , K) - 1 << ' ';
    			int ans = 0;
    			for(int i = 0 ; i <= K ; ++i)
    				ans = (ans + (i & 1 ? -1ll : 1ll) * binom(K , i) * poww(K - 2 * i , N) % MOD + MOD) % MOD;
    			cout << 1ll * ans * poww(poww(2 , K) , MOD - 2) % MOD << '
    ';
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    产品思维和用户思维
    IT界是丽春院?
    凡事要讲究方式方法
    一个比较差的接口定义
    软件开发中的官话和土话
    Frida之app逆向hook,动态插装
    Airtext远程控制多台手机
    linux下使用uwsgi部署flask写的接口遇到的坑
    软件质量管理(六)- 无有规矩不成方圆
    软件质量管理(五)- 质量优异的产品离不开一支优秀的团队
  • 原文地址:https://www.cnblogs.com/Itst/p/10548722.html
Copyright © 2011-2022 走看看