• cf 938E


    哇自闭了。

    一样个毛啊。

    和之前见过的几道感觉很类似啊。

    首先一个数如果有贡献那么在他后面一定有一个大于它的数,并且前面的全比他小,然后我就跑偏了。。。

    于是我们先排个序,显然无影响,我们可以考虑从 n 个位置里选择 n-i+1 个,用来存放 大于等于他自己的数,

    这n-i+1个位置要保证 他自己在最前面吧,就是 (n-i)! 种,剩下i-1个位置随便放,(i-1)! 

    所以一个数的贡献次数 就是 C(n,n-i+1)*(i-1)!*(n-i)!,然后再乘上权值和次数就阔以惹qwq

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N = 1e6+6;
     5 const ll mod = 1e9+7;
     6 int n;ll a[N];
     7 ll up[N],inv[N],down[N];
     8 void init(){
     9     inv[1]=down[0]=up[0]=1;
    10     for(int i=2;i<=1e6;i++){
    11         inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    12     }
    13     for(int i=1;i<=1e6;i++){
    14         up[i]=up[i-1]*i%mod;
    15         down[i]=down[i-1]*inv[i]%mod;
    16     }
    17 }
    18 int main(){
    19     //ios::sync_with_stdio(false);
    20     init();
    21     scanf("%d",&n);
    22     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    23     sort(a+1,a+1+n);
    24     ll ans=0;
    25     for(int i=1,j;i<=n;i=j+1){
    26         j=i;
    27         while (a[j+1]==a[i])j++;
    28         if(j<n)
    29         ans=(ans+a[i]*(j-i+1)%mod*up[n]%mod*up[n-i]%mod*up[i-1]%mod*down[n-i+1]%mod*down[i-1]%mod)%mod;
    30     }
    31     cout<<ans<<endl;
    32 }
    View Code
  • 相关阅读:
    Java开发系列-电子邮箱
    Java开发系列-文件上传
    iOS开发系列-常见离线存储方式
    Java开发系列-注解
    Java开发系列-JSP
    Java开发系列-Cookie与Session会话技术
    Java开发系列-JDBC
    Java开发系列-MySQL
    Java开发系列-时间转换
    java开发系列-服务器tomcat
  • 原文地址:https://www.cnblogs.com/MXang/p/10348659.html
Copyright © 2020-2023  润新知