zoukankan      html  css  js  c++  java
  • 汕头市队赛SRM 20 T3 灵魂觉醒

    背景

            自从芽衣、布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了。自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程。

            第一天,第一节课。

            “实现灵魂觉醒之前,你需要先将自己的崩坏能按顺序排好……”

            “诶诶,这个要怎么做呢?”算法课没认真听讲也是没有办法的嘛。

            于是,琪亚娜设(xia)计(bian)了一套自己的排序方法。

    描述

            我们可以用n张卡片代表崩坏能,上面恰好写了1到n。

            一开始这些卡片是随机排列的,然后为了把它们从小到大排好序,进行如下操作:

            ①如果卡片已经按1到n排好序,结束操作。

            ②观察现有排列,如果某一个大于1的区间内的数是顺序加一的,就把这个区间内的卡片粘起来,它们在以后的操作中不会分开。(比如15234这个排列会把234粘起来)

            ③把所有卡片随机排列(粘在一起的不分开),然后回到①。

            恰好路过的符华对这种排序方法非常感兴趣,希望知道它的期望复杂度。于是求期望进行③操作的次数的任务就交给你了。答案对1e9+7取模。

    输入格式

            一个不超过2000的整数n。

    输出格式

            一个整数,答案对1e9+7取模后的结果。

    样例输入

    3

    样例输出

    333333338
    

    数据范围与约定

    测试点 n
    1 1
    2 5
    3 8
    4 10
    5 13
    6 <=1000
    7 <=1000
    8 <=2000
    9 <=2000
    10 <=2000

    样例解释 

    n=3时的精确值是frac{7}{3}=2.33333...

     

    后记:

    琪亚娜·卡斯兰娜:你们是怎么排序的啊?

    雷电芽衣:有个库函数叫sort来着……

    布洛妮娅:对,挺快的。

    ————————————————————————————

    这题一开始我想着暴力 ans[x]=sigma g[x][y]*ans[y]

    g[x][y]表示长度为x的排列 排一次之后缩成y段的概率

    g[x][y]可以暴力算 不过后来打表发现是个组合数 然后就可以A辣

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    const int M=2e3+7,mod=1e9+7;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,k;
    int g[M][M];
    LL w[M],inv[M];
    LL pmod(LL a,LL b){
        int ans=1;
        while(b){
            if(b&1) ans=ans*a%mod;
            b>>=1; a=a*a%mod;
        }
        return ans;
    }
    void prepare(){
        w[0]=1; for(int i=1;i<=n;i++) w[i]=w[i-1]*i%mod;
        inv[n]=pmod(w[n],mod-2);
        for(int i=n;i;i--) inv[i-1]=inv[i]*i%mod;
    }
    int f[M],v[M],s[M],ans[M];
    void P(int &x){x=(x%mod+mod)%mod;}
    int main(){
        n=read(); prepare();
        for(int j=1;j<=n;j++){
            g[j][j]=w[j]-s[j]; P(g[j][j]);
            for(int i=j+1;i<=n;i++){
                g[i][j]=g[j][j]*(w[i-1]*inv[j-1]%mod*inv[i-j]%mod)%mod; P(g[i][j]);
                s[i]+=g[i][j]; P(s[i]);
            }
        }
        ans[1]=0;
        for(int i=2;i<=n;i++){
            LL ly=0;
            for(int j=2;j<i;j++) ly=(ly+1LL*g[i][j]*inv[i]%mod*(ans[j]+1)%mod)%mod;
            ans[i]=((ly+g[i][i]*inv[i]%mod)*pmod((1-g[i][i]*inv[i]%mod+mod)%mod,mod-2))%mod;
        }printf("%d
    ",ans[n]);
        return 0;
    }
    View Code
  • 相关阅读:
    java中native的用法
    用uWSGI和Nginx部署Flask项目
    elasticsearch之使用Python批量写入数据
    mysql 远程访问
    Chrome扩展及应用开发
    jQuery ajax
    Chrome扩展及应用开发-储存数据
    Chrome扩展及应用开发-扩展页面间的通信
    Python3 将本地时间转换成指定时区时间
    python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7630057.html
Copyright © 2011-2022 走看看