牛客月赛60 F.被抓住的小竹(数学&推式子)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客月赛60 F.被抓住的小竹(数学&推式子)相关的知识,希望对你有一定的参考价值。

牛客月赛60 F.被抓住的小竹(数学&推式子)

考虑枚举每个区间的贡献。

每个区间内所有的数都作为 x x x一次时的贡献和。

因为要求区间内 ≥ x \\ge x x数个数, 那么区间内的数从小到大排序后,显然最大的数贡献是1、第二大的数贡献是2,依此内推。

因此对于长度为 l e n len len的贡献是 ∑ i = 1 l e n i = l e n ( l e n + 1 ) 2 \\sum_i=1^leni=\\dfraclen(len+1)2 i=1leni=2len(len+1)

因此我们可以枚举区间长度。

区间长度为 i i i的个数为 n − i + 1 n-i+1 ni+1

所以总贡献是: ∑ i = 1 n ( n − i + 1 ) × i ( i + 1 ) 2 \\sum\\limits_i=1^n(n-i+1)\\times \\dfraci(i+1)2 i=1n(ni+1)×2i(i+1)然后展开化简一波。

a n s = n ( n + 1 ) ( n + 2 ) ( n + 3 ) 24 ans=\\dfracn(n+1)(n+2)(n+3)24 ans=24n(n+1)(n+2)(n+3)

是一个组合数的形式: a n s = C n + 3 4 ans=C_n+3^4 ans=Cn+34与排列无关。

因此可以提出来,然后 r e s = a n s × ∑ p i n v ( p ) res=ans\\times\\sum_pinv(p) res=ans×pinv(p)

求所有排列的逆序对和,可以这样考虑。

一共有 n ! n! n!个排列,对于一个两个数 i , j ( i < j ) i,j(i<j) i,j(i<j) 他们的贡献是对称的,也就是说有一半的 p o s i < p o s j pos_i<pos_j posi<posj,另一半是 p o s i > p o s j pos_i>pos_j posi>posj。因此贡献是 n ! 2 \\dfracn!2 2n!

所有有序对总数是 n ( n − 1 ) 2 \\dfracn(n-1)2 2n(n1)

所以答案就是: C n + 3 4 n ! n ( n − 1 ) 4 = n 2 × ( n + 3 ) ! × ( n − 1 ) 96 C_n+3^4\\dfracn!n(n-1)4=\\dfracn^2\\times (n+3)!\\times(n-1)96 Cn+344n!n(n1)=96n2×(n+3)!×(n1)

#include<bits/stdc++.h>
using namespace std;
int mod=1e9+7;
long long power(long long a,long long b)
    long long res=1;
    while(b)
        if(b&1)res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    
    return res;

long long inv(int x)
    return power(x,mod-2);

long long jc[2020200];
int main()
    jc[0]=1;
    int n,i,j,k;
    for(i=1;i<=1e5+10;i++)jc[i]=jc[i-1]*i%mod;
    cin>>k;
    while(k--)
        long long x;
        cin>>x;
        cout<<x*x%mod*(x-1)%mod*jc[x+3]%mod*inv(96)%mod<<'\\n';
    

以上是关于牛客月赛60 F.被抓住的小竹(数学&推式子)的主要内容,如果未能解决你的问题,请参考以下文章

牛客月赛43

牛客月赛42

牛客月赛42题解完结

博客总结第十周+牛客月赛

牛客月赛46部分题解

8/12 最小表示法+牛客月赛