• Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】


    题目链接:http://codeforces.com/problemset/problem/938/E

    题意:

      定义f(a):

        初始时f(a) = 0, M = 1。

        枚举i = 2 to n,如果a[i] > a[M],那么f(a) += a[M], M = i。

      给定长度为n的数组a,问你它的所有排列的f(a)之和 MOD 1e9+7。

     

    题解:

      对于某个确定排列中的一个数a[i],如果所有大于等于a[i]的数都排在a[i]之后,那么一定ans += a[i]。

      所以就要求每个a[i]对于答案的贡献,相加起来即为总答案。

     

      先将a[i]升序排列。

      考虑由所有n个数组成的排列:

        总排列数为n!。

      仅考虑由大于等于a[i]的数组成的排列:

        大于等于a[i]的数共有n-i+1个。

        总排列数为(n-i+1)!。

        其中a[i]排在最前面的排列有(n-i)!个。

      所以由n个数组成,且所有大于等于a[i]的数都排在a[i]之后

      这样的排列的总数为(n-i)! / (n-i+1)! * n!个。

      化简即为n!/(n-i+1)个。

      所以a[i]对答案作出的贡献为:n! / (n-i+1) * a[i]。

      所以对于区间[i,nex),如果a[i to nex-1]都相等的话

      这个区间对答案做出的总贡献即为:n! / (n-i+1) * a[i] * (nex-i)

      特别地,如果有a[i] == a[n],显然它对答案的贡献为0。

      另外,对于贡献中的除以(n-i+1),应该写成乘inv(n-i+1)。

      最后O(n)统计一下就好。

    AC Code:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <algorithm>
     5 #define MAX_N 1000005
     6 #define MOD 1000000007
     7 
     8 using namespace std;
     9 
    10 int n;
    11 int a[MAX_N];
    12 long long ans=0;
    13 
    14 void exgcd(int a,int b,int &x,int &y)
    15 {
    16     if(b==0)
    17     {
    18         x=1; y=0;
    19         return;
    20     }
    21     exgcd(b,a%b,y,x);
    22     y-=(a/b)*x;
    23 }
    24 
    25 int inv(int a)
    26 {
    27     int x,y;
    28     exgcd(a,MOD,x,y);
    29     return (x%MOD+MOD)%MOD;
    30 }
    31 
    32 int main()
    33 {
    34     cin>>n;
    35     for(int i=1;i<=n;i++) cin>>a[i];
    36     long long f=1;
    37     for(int i=1;i<=n;i++) f=f*i%MOD;
    38     sort(a+1,a+1+n);
    39     int nex=1;
    40     for(int i=1;i<=n;i=nex)
    41     {
    42         if(a[i]==a[n]) break;
    43         while(nex<=n && a[i]==a[nex]) nex++;
    44         ans=(ans+f*inv(n-i+1)%MOD*a[i]%MOD*(nex-i)%MOD)%MOD;
    45     }
    46     cout<<ans<<endl;
    47 }
  • 相关阅读:
    Linux下修改/设置环境变量JAVA_HOME
    php WNMP(Windows+Nginx+Mysql+php)配置笔记
    jetty
    eclipse 打包
    js 稍微判断下浏览器 pc 还是手机
    mysql 自增长
    mac 终端命令
    KVC,KVO
    Swift
    构造函数,析构函数的区别
  • 原文地址:https://www.cnblogs.com/Leohh/p/8476417.html
Copyright © 2020-2023  润新知