zoukankan      html  css  js  c++  java
  • [省选联考 2020 A 卷] 组合数问题

    [egin{align} sum_{k=0}^nsum_{j=0}^ma_jk^j imes x^k imes inom nk end{align} ]

    把 f(k) 转为下降幂多项式:

    [egin{align} &sum_{k=0}^nsum_{j=0}^mb_jk^{underline j} imes x^k imes inom nk\ &sum_{k=0}^nsum_{j=0}^mb_jn^{underline j} imes x^k imes inom{n-j}{k-j}\ &sum_{j=0}^mb_jn^{underline j} sum_{k=0}^n x^k imes inom{n-j}{n-k}\ &sum_{j=0}^mb_jn^{underline j} x^jsum_{k=0}^{n-j} x^{n-j-k} imes inom{n-j}{k}\ &sum_{j=0}^mb_jn^{underline j} x^j(1+x)^{n-j} end{align} ]

    很妙。

    #include<bits/stdc++.h>
    typedef long long LL;
    using namespace std;
    
    const int M = 2e3 + 3;
    int mo;
    
    int ksm(int a, int b) {
    	int res = 1;
    	for(; b; b>>=1, a=((LL)a*a) % mo)
    		if(b & 1) res = ((LL)res * a) % mo;
    	return res;
    }
    
    int n, m, x;
    int a[M], b[M], S[M][M];
    
    int main()
    {
    	scanf("%d%d%d%d", &n, &x, &mo, &m);
    	for(int i = 0; i <= m; ++i) scanf("%d", &a[i]);
    	S[0][0] = 1;
    	for(int i = 1; i <= m; ++i) {
    		for(int j = 1; j <= i; ++j) {
    			S[i][j] = ((LL)j * S[i-1][j] % mo + S[i-1][j-1]) % mo;
    		}
    	}
    	for(int i = 0; i <= m; ++i) {
    		for(int j = 0; j <= i; ++j) {
    			b[j] += (LL)S[i][j] * a[i] % mo;
    			b[j] %= mo;
    		}
    	}
    	LL ans = 0ll;
    	int n_f_j = 1;
    	for(int j = 0; j <= m; ++j) {
    		ans += (LL)b[j] * (LL)n_f_j % mo * (LL)ksm(x, j) % mo * (LL)ksm(x + 1, n - j) % mo;
    		ans %= mo;
    		n_f_j = (LL)n_f_j * (LL)(n-j) % mo;
    	}
    	cout << ans;
    	return 0;
    }
    
  • 相关阅读:
    各种集群服务
    cdn
    网页请求的完整过程
    html
    ajax异步请求技术
    浅谈前端渲染与后端渲染的区别
    html与php
    Ubuntu安装anaconda3
    win10安装Ubuntu系统
    删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/tztqwq/p/14353014.html
Copyright © 2011-2022 走看看