zoukankan      html  css  js  c++  java
  • loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对

     

    题目描述

    给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数。答案对 109+7 10 ^ 9 + 7109​​+7 取模。

    对于一个长度为 n nn 的排列 p pp,其逆序对数即满足 i<j i < ji<j 且 pi>pj p_i > p_jpi​​>pj​​ 的二元组 (i,j) (i, j)(i,j) 的数量。

    输入格式

    一行两个整数 n,k n, kn,k。

    输出格式

    一行,表示答案。

    样例

    样例输入

    7 12

    样例输出

    531

    数据范围与提示

    对于 20% 20\%20% 的数据,n,k≤20 n, k leq 20n,k20;
    对于 40% 40\%40% 的数据,n,k≤100 n, k leq 100n,k100;
    对于 60% 60\%60% 的数据,n,k≤5000 n, k leq 5000n,k5000;
    对于 100% 100\%100% 的数据,1≤n,k≤100000,1≤k≤(n2) 1 leq n, k leq 100000, 1 leq k leq inom{n}{2}1n,k100000,1k(2n​​)。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define mod 1000000007
    #define maxn 5002
    using namespace std;
    int dp[maxn][maxn],n,sum[maxn][maxn],m;
    int Max(int x,int y){return x>y?x:y;}
    int Min(int x,int y){return x<y?x:y;}
    int main(){
        scanf("%d%d",&n,&m);m++;
        dp[1][1]=1;
        sum[1][1]=1;
        int lim,i,j,l,r;
        for(i=2;i<=n;++i){
            lim=(i-1)*i/2+1;
            for(j=1;j<=min(lim,m);++j){
                l=Max(j-i,0);r=Min(j,(i-1)*(i-2)/2+1);
                dp[i][j]=sum[i-1][r]-sum[i-1][l];
                if(dp[i][j]<0)dp[i][j]+=mod;
                else if(dp[i][j]>=mod)dp[i][j]-=mod;
                sum[i][j]=sum[i][j-1]+dp[i][j];
                if(sum[i][j]>=mod)sum[i][j]-=mod;
            }
        }
        printf("%d",dp[n][m]);
        return 0;
    }
    60分 dp+前缀和优化
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define maxn 200010
    #define mod 1000000007
    using namespace std;
    int n,k,S;
    long long f[510][maxn],inv[maxn],fac[maxn],a[maxn];
    long long C(int n,int m){
        return fac[n]*inv[m]%mod*inv[n-m]%mod;
    }
    long long Pow(long long x,int y){
        long long res=1;
        while(y){
            if(y&1)res=res*x%mod;
            x=x*x%mod;
            y>>=1;
        }
        return res;
    }
    int main(){
        scanf("%d%d",&n,&k);
        S=sqrt(k<<1)+3;
        f[0][0]=1;
        for(int i=1;i<=S;i++)
            for(int j=i;j<=k;j++){
                f[i][j]=(f[i][j-i]+f[i-1][j-i])%mod;
                if(j>n)f[i][j]=(f[i][j]-f[i-1][j-n-1])%mod;
            }
        fac[0]=inv[0]=1;
        for(int i=1;i<=k+n;i++){
            fac[i]=1LL*fac[i-1]*i%mod;
            inv[i]=Pow(fac[i],mod-2);
        }
        long long ans=C(n+k-1,n-1);
        for(int i=1;i<=S && i<=n;i++){
            long long cur=0;
            for(int j=1;j<=k;j++)
                cur=(cur+f[i][j]*C(n+k-j-1,n-1))%mod;
            if(i&1)cur=-cur;
            ans=(ans+cur)%mod;
        }
        ans=(ans+mod)%mod;
        cout<<ans;
    }
    100分
  • 相关阅读:
    【TouchGFX】使用CubeMX创建touchgfx项目 -- 初始篇
    opencv haarcascades 下载
    更换 Anaconda 源(贼快)
    yii2 允许跨域
    sublime text 3 安装 pyv8 失败的解决办法
    win10 anaconda cuda11.1 安装 tensorlfow-gpu 环境
    nginx 403转404
    python requests 全部异常
    win10 anaconda 安装 tensorflow-gpu 及 jupyter notebook
    【PHP】自有图片服务器,图片动态裁剪缩放
  • 原文地址:https://www.cnblogs.com/thmyl/p/8891151.html
Copyright © 2011-2022 走看看