zoukankan      html  css  js  c++  java
  • 【ybtoj高效进阶 21277】逆序对数(数学)(DP)

    逆序对数

    题目链接:ybtoj高效进阶 21277

    题目大意

    问你有多少个长度为 n 的排列的逆序对个数是 n。

    思路

    你考虑不断加入越来越大的数,那每次给逆序对个数的贡献区间就是 (0sim i-1)
    总的来讲,每次贡献的上界是 (1,2,..,n-1)

    然后 DP 当然会超时,考虑小小容斥一下。
    考虑到要的个数和是 (n),相对 (n(n+1)/2) 很小,考虑从这里下手。
    (f_{i,j}) 为有至少 (i) 个超过限制,当前的和是 (j) 的方案数。

    那不难想到答案就是容斥一下,如果 (i) 是奇数对答案的贡献就是负的,否则是正的。
    那当然这个是排好序的,剩下的部分没有排序,我们就直接暴力出来 (n-i) 个位置。
    根据插板法:(C^{n-1}_{(n-1)+n-1})
    考虑每次新放一个数,放不超过限制的还是超过限制的。

    然后你考虑怎么一搞:把所有数都加一个,然后再前面放 (1) 或者 (2)
    那每次增加的就是 (i) 或者 (i+1)
    而且从 (i,j),不超过限制就是转移到 (i,j+i),超过限制就是转移到 (i+1,j+i+1)

    然后搞一搞即可。

    代码

    #include<cstdio>
    #define ll long long
    #define mo 1000000007
    
    using namespace std;
    
    int n;
    ll f[501][100001], jc[200001], inv[200001];
    ll get_c[100001], ans;
    
    ll ksm(ll x, ll y) {
    	ll re = 1;
    	while (y) {
    		if (y & 1) re = re * x % mo;
    		x = x * x % mo;
    		y >>= 1;
    	}
    	return re;
    }
    
    ll C(int x, int y) {
    	if (x < y) return 0;
    	return jc[x] * inv[y] % mo * inv[x - y] % mo;
    }
    
    int main() {
    //	freopen("pairs.in", "r", stdin);
    //	freopen("pairs.out", "w", stdout);
    	
    	scanf("%d", &n);
    	
    	jc[0] = 1;//预处理
    	for (int i = 1; i <= 2 * n; i++) jc[i] = jc[i - 1] * i % mo;
    	inv[2 * n] = ksm(jc[2 * n], mo - 2);
    	for (int i = 2 * n - 1; i >= 0; i--)
    		inv[i] = inv[i + 1] * (i + 1) % mo; 
    	
    	for (int i = 0; i <= n; i++)
    		get_c[i] = C(i + n - 1, n - 1);
    	
    	ans = get_c[n];
    	f[1][1] = 1;
    	for (int j = 1; j * (j + 1) / 2 <= n; j++)//DP
    		for (int i = 1; i <= n; i++) {
    			if (j & 1) ans = (ans + mo - f[j][i] * get_c[n - i] % mo) % mo; 
    				else ans = (ans + f[j][i] * get_c[n - i] % mo) % mo;
    			if (i + j <= n) f[j][i + j] = (f[j][i + j] + f[j][i]) % mo;
    			if (i + j < n) f[j + 1][i + j + 1] = (f[j + 1][i + j + 1] + f[j][i]) % mo;
    		}
    	
    	printf("%lld", ans);
    	
    	return 0;
    }
    
  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/Sakura-TJH/p/YBTOJ_GXJJ_21277.html
Copyright © 2011-2022 走看看