• ARC102E


    枚举 (i),然后可以把 (j)(i - j) 绑定成一对。把一对看成一个整的元素,与别的没有被绑定的数一起来参与选择就可以了。

    但是由于实际上一对中的数是可以二选一的,所以不妨令 (t) 表示一组方案中出现的对的数的个数,那么有 (t) 对数至少出现一次的选择方法的方案数就还需要乘上 (2^t)

    (s) 表示原来的 (k) 个数去掉所有的被绑定的对以后的值域的大小,由插板法可以求出,出现了 (t) 个对的方案数为:

    [inom{k}{j}inom{n+s-1}{t+s-1}cdot2^t ]

    另外,如果 (i) 是偶数,那么 (frac i2) 只能出现一次。可以枚举有没有出现,将之转化为两个子问题。

    #include<bits/stdc++.h>
    
    #define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
    #define dbg(...) fprintf(stderr, __VA_ARGS__)
    #define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
    #define fi first
    #define se second
    #define pb push_back
    
    template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b , 1 : 0;}
    template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b , 1 : 0;}
    
    typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
    
    template<typename I>
    inline void read(I &x) {
    	int f = 0, c;
    	while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
    	x = c & 15;
    	while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
    	f ? x = -x : 0;
    }
    
    const int N = 4000 + 7;
    const int P = 998244353;
    
    int n, k;
    int C[N][N];
    
    inline int smod(int x) { return x >= P ? x - P : x;}
    inline void sadd(int &x, int y) { x += y; x >= P ? x -= P : x; }
    inline void ycl(int n) {
    	C[0][0] = 1;
    	for (int i = 1; i <= n; ++i) {
    		C[i][0] = 1;
    		for (int j = 1; j <= i; ++j) C[i][j] = smod(C[i - 1][j] + C[i - 1][j - 1]);//, dbg("C(%d, %d) = %d
    ", i, j, C[i][j]);
    	}
    }
    
    inline int calc(int n, int i, int k) {
    	int ans = 0;
    	int lim = std::min(i - 1, k) - (i / 2 + 1) + 1, ss = k - (lim << 1), mul = 1;
    //	dbg("i = %d, k = %d, lim = %d
    ", i, k, lim);
    	for (int j = 0; j <= lim; ++j) {
    		sadd(ans, (ll)C[lim][j] * C[n + ss - 1][j + ss - 1] % P * mul % P);
    //		dbg("W: i = %d, ans = %d
    ", i, ans);
    		mul = smod(mul << 1);
    	}
    	return ans;
    }
    
    inline void work() {
    	ycl(n + k);
    	for (int i = 2; i <= (k << 1); ++i)
    		if (i & 1) printf("%d
    ", calc(n, i, k));
    		else printf("%d
    ", smod(calc(n, i - 1, k - 1) + calc(n - 1, i - 1, k - 1)));
    }
    
    inline void init() {
    	read(k), read(n);
    }
    
    int main() {
    #ifdef hzhkk
    	freopen("hkk.in", "r", stdin);
    #endif
    	init();
    	work();
    	fclose(stdin), fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    win10下载文件夹变成了英文了如何解决
    Win10-更改c盘下的用户文件夹名
    Linux下/proc目录简介
    Linux高级运维工程师:100道面试题整理
    centos8安装 rabbitmq
    针对美国、加拿大和意大利的大型僵尸网络
    CentOS8配置网卡为静态IP
    分布式版本控制系统-Github
    KVM三企业级虚拟化技术KVM网络及脚本管理
    KVM二企业级虚拟化技术KVM管理
  • 原文地址:https://www.cnblogs.com/hankeke/p/ARC102E.html
Copyright © 2020-2023  润新知