zoukankan      html  css  js  c++  java
  • JZOJ.5235【NOIP2017模拟8.7】好的排列

    Description

    对于一个1->n的排列 ,定义A中的一个位置i是好的,当且仅当Ai-1>Ai 或者Ai+1>Ai。对于一个排列A,假如有不少于k个位置是好的,那么称A是一个好的排列。
    现在有q个询问,每个询问给定n,k,问有多少排列是好的。答案对10^9+7取模。
     

    Input

    输入文件名为permutation.in。
    首先输入q。
    接下来输入q个询问n,k 。

    Output

    输出文件名为permutation.out。
    输出q行,每行一个整数代表答案。
     

    Sample Input

    8
    4 3
    6 4
    10 7
    20 14
    50 40
    100 72
    1000 900
    3000 2000

    Sample Output

    8
    448
    1433856
    868137807
    908422882
    609421284
    150877522
    216180189
     

    Data Constraint

    对于20%的数据,n<=10,q=1
    对于40%的数据,n<=20,q=1
    对于60%的数据,n<=100
    对于100%的数据,n,k<=3000,q<=10000
     

     正难则反,我们可以考虑下“坏数字”(谷峰)($a_{i-1} < a_{i}>a_{i+1}$)。数位动规,数字的位置变换我们可以想象成插入,令F[i][j]表示到第i个数字,此时有j个谷峰的合法插入方案数,则第i个数字如果查到j个坏数字的两侧,则不会产生新的“谷峰”,那么有2*j个位置,F[i][j]*(2*j)-->F[i+1][j],如果插到其他位置,则会产生一个新的“谷峰”(序列两侧可以分别假想有个0),那么有(i-2*j)个位置,F[i][j]*(i-(2*j))-->F[i+1][j+1].初始条件F[1][1]=1,最后$ans=sum _{i=1}^{n-k}fleft[ n ight] left[ i ight]$

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #define qaq 1000000007
     6 using namespace std;
     7 int n,k,q;
     8 long long f[3002][3002];
     9 long long ans;
    10 int main(){
    11     freopen("permutation.in","r",stdin);
    12         freopen("permutation.out","w",stdout);
    13         f[1][1]=1;
    14     for (int i=2;i<=3000;i++)
    15      for (int j=1;j<=3000;j++)
    16       if (!f[i][j])
    17        f[i][j]=f[i-1][j]*(2*j)%qaq+f[i-1][j-1]*(i-2*(j-1))%qaq;
    18     scanf("%d",&q);
    19     while (q--){
    20         scanf("%d%d",&n,&k);;
    21          ans=0;
    22          for (int i=n-k;i>=1;i--)
    23           ans=(ans+f[n][i])%qaq;
    24         printf("%lld
    ",ans);
    25     }
    26     return 0;
    27 }
    神奇的代码

    (事实上我们可以预处理n,k到3000的值最后再直接累加即可)

  • 相关阅读:
    php 扩展编译linux
    PHP 单态设计模式
    Apache 支持.htaccess
    Apache 禁止访问目录
    jQuery 获取父元素、子元素、同级元素
    CentOS 配置防火墙操作实例(启、停、开、闭端口):
    CentOS 安装 lamp(转)
    火狐浏览器 js 1到9月份 new DATE不返回时间
    web 打开子窗口提交数据或其他操作后 关闭子窗口且刷新父窗口实现
    jquery on 绑定多个事件 多个元素
  • 原文地址:https://www.cnblogs.com/Lanly/p/7299828.html
Copyright © 2011-2022 走看看