排列逆序对计数

https://pan.baidu.com/s/1mRenOxuGQ9gEpW7WsJXf4Q    7uqg 

组合计数,结合数位DP的思想。

考试话3小时做出来了,结果没开LL,50分,很崩溃

https://www.cnblogs.com/universeplayer/p/10565654.html

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define rg register
 4 typedef long long ll;
 5 #define gmax(a,b) a=max(a,b)
 6 #define gmin(a,b) a=min(a,b)
 7 #define FOR(i,a,b) for(rg int i=a;i<=b;++i)
 8 #define For(i,a,b) for(rg int i=a;i>=b;--i)
 9 #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++
10 static char buf[100000],*pa(buf),*pb(buf);
11 inline int rd()
12 {
13     rg int x(0),w(1);
14     rg char c(gc);
15     while(c<'0' || c>'9')
16     {
17         if(c=='-') w=-1;
18         c=gc;
19     }
20     while(c>='0' && c<='9') x=x*10+c-48,c=gc;
21     return x*w;
22 }
23 
24 const int N=1000005;
25 const ll MOD=998244353,ny=499122177;
26 ll f[N],g[N],tn[N],jc[N];
27 int c[N],a[N],n;
28 ll ans;
29 
30 void add(int x,int y)
31 {
32     for(;x<=n;x+=x&(-x)) c[x]+=y;
33 }
34 
35 ll ask(int x)
36 {
37     ll res=0;
38     for(;x;x-=x&(-x)) res+=c[x];
39     return res;
40 }
41 
42 int main()
43 {
44     freopen("sort.in","r",stdin);
45     freopen("sort.out","w",stdout);
46     n=rd();FOR(i,1,n) a[i]=rd();
47     jc[0]=1;FOR(i,1,n) jc[i]=(i*jc[i-1])%MOD;
48     FOR(i,2,n) f[i]=((i*f[i-1])%MOD+(1LL*i*(i-1)/2)%MOD*jc[i-1]%MOD)%MOD;
49     tn[1]=1;add(a[n],1);
50     FOR(i,2,n)
51         g[i]=ask(a[n-i+1]),add(a[n-i+1],1),
52         tn[i]=((g[i]*jc[i-1])%MOD+tn[i-1])%MOD;
53     FOR(i,1,n) ans=(ans+g[i]*f[i-1]%MOD+g[i]*(g[i]-1)%MOD*ny%MOD*jc[i-1]%MOD+g[i]*tn[i-1]%MOD)%MOD;
54     cout<<ans;
55     return 0;
56 }

 

转载于:https://www.cnblogs.com/universeplayer/p/10565737.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 逆序数是指在一个序列中,如果一个数比它后面的数小,则这两个数构成一个逆序对。以下是Python中求逆序数的一种简单算法: ```python def count_inversions(arr): """ 返回一个序列的逆序数 """ inversions = 0 for i in range(len(arr)): for j in range(i+1, len(arr)): if arr[i] > arr[j]: inversions += 1 return inversions ``` 这个算法的时间复杂度是 $O(n^2)$,如果需要处理大量的数据,可以考虑使用更高效的算法,比如归并排序。 ### 回答2: 逆序数指的是一个数的每个位上的数字按照相反的顺序排列,例如逆序数"1234"就是"4321"。而在Python中,可以使用字符串的切片来实现逆序数的表达。 首先,我们将需要逆序的数转换为字符串类型,可以使用str()函数将其转换为字符串。接下来,使用字符串的切片[::-1],这个切片的作用是按照相反的顺序取出字符串中的每个字符,达到逆序的效果。最后,将逆序后的字符串转换为整数类型,可以使用int()函数来实现。 下面是一个示例代码,演示了如何使用Python逆序数表达: ```python num = 1234 reverse_num = int(str(num)[::-1]) print(reverse_num) ``` 运行以上代码,输出结果为4321,即为数值1234的逆序数表达。 当然,在实际应用中,如果我们需要将逆序数表达应用到更复杂的问题上,可能还需要进行更多的操作和判断。但是基本的逆序数表达可以通过上述方法简单地实现。 ### 回答3: Python中可以使用切片操作来逆序输出一个数列或字符串。切片操作使用方括号和冒号来指定开始位置和结束位置,其中开始位置默认为0,结束位置默认为数列的长度。 如果要逆序输出一个数列,可以使用切片操作中的负数索引。负数索引从最后一个元素开始计数,即-1表示最后一个元素,-2表示倒数第二个元素,以此类推。通过指定开始位置为负数索引、结束位置为第一个元素之前的索引,再指定步长为-1,即可实现逆序输出数列。 举个例子,假设有一个数列nums = [1, 2, 3, 4, 5],要逆序输出这个数列,可以使用以下代码: ```python nums = [1, 2, 3, 4, 5] reverse_nums = nums[::-1] print(reverse_nums) ``` 运行这段代码,就会输出逆序后的数列[5, 4, 3, 2, 1]。 同样地,如果要逆序输出一个字符串,也可以使用切片操作。例如,有一个字符串s = "hello",要逆序输出这个字符串,可以使用以下代码: ```python s = "hello" reverse_s = s[::-1] print(reverse_s) ``` 运行这段代码,就会输出逆序后的字符串"olleh"。 总结起来,Python中逆序输出数列或字符串可以通过使用切片操作,将开始位置指定为负数索引,结束位置指定为第一个元素之前的索引,并设置步长为-1来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值