首页 > 其他分享 >序列、排列的全排列的逆序对

序列、排列的全排列的逆序对

时间:2023-04-21 15:36:13浏览次数:43  
标签:排列 int res LL long ull 序列 逆序

1.

题目大意:

给一个长度为n的的数组a,n是1到1e5,ai是1到1e5,问a的所有排序的序列的逆序对之和,会有重复的数字出现

题目链接:https://ac.nowcoder.com/acm/contest/46597/E

typedef long long ll;
typedef long long LL;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef pair<double,double> pdd;
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
#define endl '\n'
const int N = 1e5 + 7;
LL ksm(LL x, LL y) {
	LL res = 1;
	while (y) {
		if (y & 1) {
			res = 1ll * res * x % MOD;
		}
		x = 1ll * x * x % MOD;
		y >>= 1;
	}
	return res;
}
LL inv(int x) {
	return ksm(x, MOD - 2);
}
LL b[N], fac[N];
signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int n;
	std::cin >> n;
	std::vector<LL>a(n + 1), s(n + 1), cnt(n + 1);
	for (int i = 1; i <= n; ++i) {
		std::cin >> a[i];
		b[i] = a[i];
	}
	if (n == 1) {
		std::cout << 0 << '\n';
		return 0;
	}
	std::sort(b + 1, b + 1 + n);
	int len = std::unique(b + 1, b + 1 + n) - b - 1;
	for (int i = 1; i <= n; ++i) {
		a[i] = std::lower_bound(b + 1, b + 1 + len, a[i]) - b;
		++cnt[a[i]];
	}
	fac[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fac[i] = 1ll * fac[i - 1] * i % MOD;
	}
	LL ans = 0;
	for (int i = 1; i <= len; ++i) {
		s[i] = s[i - 1] + cnt[i];
	}
	for (int i = 1; i <= len; ++i) {
		ans = (ans + s[i - 1] * cnt[i]) % MOD;
	}
	std::cout << 1ll * ans * fac[n] % MOD * inv(2) % MOD << '\n';

	return 0;
}

2

题目大意:

求所有由1-9组成的长度为n的序列逆序对总数。会有重复的数字
题目链接:https://vjudge.net/problem/SCU-4571

思路: 直接算贡献, 也就是我们直接从9个里任选2人, 那么这两个就可以造成一个1的贡献, 那么其他地方了? 就可以随便填, 然后算出送的填的方式即可. 所以公式就是: \(C(n, 2) * C(9, 2) * 9^{n-2}\).
含义就是9个里任选选出了两个数, 可以造成贡献1, 那么方案是在n个位置中任选的两个位置去填这任选的两个数字, 然后其他位置可以9个数字任意填, 所以答案就是这么多.

注意取mod, 用unsigned long long 溢出自动取mod, 即自动取\(2^{64}\)的mod.

#define ull unsigned long long int
ull qpow(ull x, ull y) {
    ull res = 1;
    while(y) {
        if (y & 1) res = res * x;
        x *= x;
        y >>= 1;
    }
    return res;
}
void solve()
{
    ull n;
    cin >> n;
    ull ans = (n * (n-1) / 2) * (9 * 8 / 2) * qpow(9, n-2);
    cout << ans << endl;
}

3

题目大意:

求长为n的全部排列的逆序对的数量,这里是排列了
题目链接:https://vjudge.net/problem/SCU-4571

经典结论:长度为n的排列的逆序对数量的期望为\(C(n,2)/2\)。

简单证明:任意两个数在一个排列中,为逆序的概率是\((1/2)\),选择两个数的方案为\(C(n,2)\)。
故长度为n的排列的逆序对数量的总和为n!*C(n,2)/2,其中,n!是排列的数量
例题:https://ac.nowcoder.com/acm/contest/45670/F

标签:排列,int,res,LL,long,ull,序列,逆序
From: https://www.cnblogs.com/QingyuYYYYY/p/17340517.html

相关文章

  • 数字序列中某一位的数字
    classSolution{public:intdigitAtIndex(intn){if(!n)return0;longlongstart=1,len=1,cnt=1;//记录区间的起始位置,记录区间长度,cnt记录当前是几位数//往后走,跨度为一个区间while(1){len=start*9*cnt;......
  • 树状数组解决逆序对问题c++
    前言在算法竞赛中,求逆序对是一个常见的问题。逆序对是指在一个数列中,如果存在,且,那么就是一个逆序对。例如,数列中的逆序对有,总共有树状数组树状数组(FenwickTree)是一种高效的数据结构,用于维护数列的前缀和。树状数组的主要优势在于可以快速对数列进行单点更新和区间查询,时间......
  • Prufer 序列学习笔记
    一、前言感觉它本身没有什么用。主要是用于计数问题。前置知识:树的定义。二、定义对于一棵有\(n\)个节点的无根树\(T\),定义其Prufer序列为执行以下操作\(n-2\)次所形成的长度为\(n-2\)的正整数序列。·选择其编号最小的度数为\(1\)的节点,输出唯一与其相邻的节点的......
  • 分布滞后线性和非线性模型(DLNM)分析空气污染(臭氧)、温度对死亡率时间序列数据的影响|附
    全文下载链接 http://tecdat.cn/?p=23947 最近我们被客户要求撰写关于分布滞后线性和非线性模型的研究报告,包括一些图形和统计输出。分布滞后非线性模型(DLNM)表示一个建模框架,可以灵活地描述在时间序列数据中显示潜在非线性和滞后影响的关联。该方法论基于交叉基的定义,交叉基是......
  • 有向图的拓扑序列
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1e5+10;intn,m;inth[N],e[N],ne[N],idx;intd[N];//入线intq[N];voidadd(inta,intb){e[idx]=b;ne[idx]=h[a];h[a]=idx++;}boolto......
  • LOJ #6564 - 最长公共子序列(bitset 求 LCS)
    怎么全天下就我没见过?被薄纱了/ll还是考虑从朴素的DP入手优化。不难发现对于固定的\(i\),相邻的\(dp_{i,j}\)的差要么是\(0\)要么是\(1\),也就是说从压位的考虑角度可能很有前途。因此我们转而维护\(dp_{i,j}\)的差分数组\(v_{i,j}=dp_{i,j}-dp_{i,j-1}\)。考虑新添加一......
  • 【230419-5】在某种信息传输过程中,用4个数字的一个排列表示1个信息,不同排列表示不同信
    ......
  • w5-1 序列合并
     方法一:#include<iostream>#include<queue>usingnamespacestd;//排序模拟,tle做法intnow1[100000],now2[100000];intmain(){intn;priority_queue<int,vector<int>,greater<int>>pq;cin>>n;for(inti=0;i<......
  • 通过fastaread读取DNA序列并进行检测matlab仿真
    1.算法描述fastareadfastaread函数是matlab生物信息学工具箱内置的一个函数,给我们的使用上带来了巨大的方便。对于基因DNA序列,转录RNA序列和表达蛋白序列的读取非常方便。使用语法为:p53nt=fastaread('p53nt.txt')%p53nt.txt为fasta格式存储序列的文件返回的p53nt......
  • w5-4 验证栈序列
     #include<iostream>#include<stack>usingnamespacestd;intq,n,a[100000],b[100000],num;intmain(){cin>>q;stack<int>s;for(intj=0;j<q;++j){cin>>n;num=0;for(inti=0;i<n;++......