zoukankan      html  css  js  c++  java
  • ARC102 Stop.Otherwise... 生成函数计数

    ARC102 Stop.Otherwise... 生成函数计数

    题意

    给定(N)个具有(K)个面的骰子,每一面有(1-K)的点数,问任意两面之和不等于(i)的方案数,(2 leq i leq 2K)

    [1 leq K leq 2000\ 2 leq N leq 2000\ ]

    分析

    此题可以容斥可以直接组合数算可以DP 这里采用相对来说无脑一点的OGF做法?

    把每个点数看成物品,那么我们可以把物品分为如下三类:

    (i = I)

    (1.)对于点数(i),若存在(j)(i + j = I),那么可以把(ij)看成同一组的物品,这组物品中要么全选(i),要么全选(j)

    (2.)若点数(i * 2 = I) ,显然(i)只可以被选择0次或1次

    (3.) 对于其他点数可以随意选择

    考察(1,2,3)的生成函数

    (1.) (F(x) = 1 + 2x + 2x^2 + ... = (1 + x)(1 + x + x^2...) = frac{1+x}{1-x})

    (2.F(x) = 1 + x)

    (3.F(x) = 1 + x + x^2... = frac{1}{1 +x})

    对于1,为什么有系数2呢,这是因为对于一组内的(i.j)可以有两种选择,因此考虑或的意义,需要叠加计算

    于是直接乘起来即可,可以看出最后会形如(frac{(1+x)^p}{(1-x)^q})

    直接统计即可,最后(O(n))的求出卷积系数

    复杂度(O(nk))

    代码

    int inv[4005],fac[4005];
    
    int C(int n,int m){
    	if(m > n || n < 0 || m < 0) return 0;
    	return (ll)fac[n] * inv[m] % MOD * inv[n - m] % MOD;
    }
    
    ll ksm(ll a,ll b = MOD - 2,ll m = MOD){
    	ll ans = 1;
    	ll base = a;
    	while(b) {
    		if(b & 1) {
    			ans *= base;
    			ans %= MOD;
    		}
    		base *= base;
    		base %= m;
    		b >>= 1;
    	}
    	return ans;
    }
    
    int main(){
    	int k = rd();
    	int n = rd();
    	fac[0] = inv[0] = 1;
    	for(int i = 1;i <= 4000;i++) fac[i] = (ll)fac[i - 1] * i % MOD,inv[i] = (ll)inv[i - 1] * ksm(i) % MOD;
    	for(int i = 2;i <= 2 * k;i++){
    		int p = 0;
    		int q = 0;
    		for(int j = 1;j <= k;j++){
    			if(i - j >= 1 && i - j <= k && (i != (j << 1))) {
    				if(j > i - j) p++,q++;
    			}
    			else if(i != (j << 1)) q++;
    			else p++;
    		}
    		int res = 0;
    		for(int j = 0;j <= n;j++){
    			res += (ll)C(p,j) * C(n - j  + q - 1,q - 1) % MOD;
    			res %= MOD;
    		}
    		cout << res << '
    ';
    	}
    }
    
  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14627233.html
Copyright © 2011-2022 走看看