• 牛客月赛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}^{len}i=\dfrac{len(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 \dfrac{i(i+1)}{2} i=1n(ni+1)×2i(i+1)然后展开化简一波。

    a n s = n ( n + 1 ) ( n + 2 ) ( n + 3 ) 24 ans=\dfrac{n(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(ii,j(i<j) 他们的贡献是对称的,也就是说有一半的 p o s i < p o s j pos_iposi<posj,另一半是 p o s i > p o s j pos_i>pos_j posi>posj。因此贡献是 n ! 2 \dfrac{n!}{2} 2n!

    所有有序对总数是 n ( n − 1 ) 2 \dfrac{n(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\dfrac{n!n(n-1)}{4}=\dfrac{n^2\times (n+3)!\times(n-1)}{96} Cn+344n!n(n1)=96n2×(n+3)!×(n1)

    #include
    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';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    集合框架和泛型二
    centos使用Iptables控制防火墙——使用
    使用datax将数据从InfluxDB抽取到TDengine过程记录
    1.启动前端项目(命令行)
    git-idea中项目取消git关联和新增git关联
    园子的商业化努力-行行AI人才培养「常青藤计划」
    计算机视觉项目实战-背景建模与光流估计(目标识别与追踪)
    【牛客 - 剑指offer】JZ77 按之字形顺序打印二叉树 Java实现
    【MDPI出版社】物联网通信类SCI&EI,仅2-3个月左右录用
    oracle基础-多表关联查询 备份
  • 原文地址:https://blog.csdn.net/weixin_45750972/article/details/127825485