首先我们可以这样想:

设状态f[i, j]表示1~i序列有j个'<'的方案数

那么考虑转移

因为i比i-1大,所以可以考虑从i-1来转移。首先i是要插入1~i-1这个序列的,所以我们可以思考插入的位置:

仔细推下可得:

当插入的位置原来是‘<'时,答案不会改变

当插入的位置原来是'>'时,答案会+1

当插入左边界时,答案不变

当插入有边界时,答案+1

那么我们知道了前i-1的'<'数量和'>'的数量那么就能转移了

f[i,j]=(j+1)*f[i-1, j]+(max{i-1-(j-1), 0}+1)*f[i-1, j-1])

然后用高精度做。。

我就不吐槽高精度写错了个地方调试了好久!!!!!!!!!!!!

记住每一次调用的运算数一定要清空!!!!即在赋值的时候一定先清空后赋值!!!!!

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <string>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <set>
  9. #include <vector>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. #define pii pair<int, int>
  14. #define mkpii make_pair<int, int>
  15. #define pdi pair<double, int>
  16. #define mkpdi make_pair<double, int>
  17. #define pli pair<ll, int>
  18. #define mkpli make_pair<ll, int>
  19. #define rep(i, n) for(int i=0; i<(n); ++i)
  20. #define for1(i,a,n) for(int i=(a);i<=(n);++i)
  21. #define for2(i,a,n) for(int i=(a);i<(n);++i)
  22. #define for3(i,a,n) for(int i=(a);i>=(n);--i)
  23. #define for4(i,a,n) for(int i=(a);i>(n);--i)
  24. #define CC(i,a) memset(i,a,sizeof(i))
  25. #define read(a) a=getint()
  26. #define print(a) printf("%d", a)
  27. #define dbg(x) cout << (#x) << " = " << (x) << endl
  28. #define error(x) (!(x)?puts("error"):0)
  29. #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
  30. #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
  31. inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
  32. inline const int max(const int &a, const int &b) { return a>b?a:b; }
  33. inline const int min(const int &a, const int &b) { return a<b?a:b; }
  34.  
  35. const int N=1155;
  36. int n, k;
  37. typedef int big[N];
  38. big f[N], tp, tp2;
  39. void clr(big a) { memset(a, 0, sizeof(int)*(a[0]+1)); a[0]=1; }
  40. void eqr(big a) { clr(a); memcpy(a, tp, sizeof(int)*(tp[0]+1)); } //先清空
  41. void fix(big a) { int i=a[0]; while(i>1 && !a[i]) --i; a[0]=i; }
  42. void Pr(big a) { for3(i, a[0], 1) printf("%d", a[i]); }
  43. void mul(big a, int t) {
  44. clr(tp);
  45. for1(i, 1, a[0]) tp[i]=a[i]*t;
  46. int k=0, i, sz=a[0]+32;
  47. for(i=1; i<=sz || k; ++i) {
  48. tp[i]+=k;
  49. k=tp[i]/10;
  50. tp[i]%=10;
  51. }
  52. tp[0]=i; fix(tp);
  53. }
  54. void pls(big a, big b) {
  55. clr(tp);
  56. int k=0, i, sz=max(a[0], b[0]);
  57. for(i=1; i<=sz || k; ++i) {
  58. tp[i]=a[i]+b[i]+k;
  59. k=tp[i]/10;
  60. tp[i]%=10;
  61. }
  62. tp[0]=i; fix(tp);
  63. }
  64.  
  65. int main() {
  66. read(n); read(k);
  67. for1(i, 0, k) clr(f[i]);
  68. f[0][1]=1;
  69. for1(i, 2, n) for3(j, k, 0) {
  70. mul(f[j], j+1); eqr(f[j]);
  71. if(j>0) {
  72. int t=max(0, i-1-j)+1;
  73. mul(f[j-1], t);
  74. eqr(tp2);
  75. pls(f[j], tp2);
  76. eqr(f[j]);
  77. }
  78. }
  79. Pr(f[k]);
  80. return 0;
  81. }

  


【题目描述】

将 1 到 N 任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。

问在所有排列中,有多少个排列恰好有K个“<”。

例如排列(3, 4, 1, 5, 2)

3 < 4 > 1 < 5 > 2

共有2个“<”

【输入格式】

N,K

【输出格式】

答案

【样例输入】

5
2

【样例输出】

66

【数据范围】

20%:N
<= 10

50%:答案在0..2^63-1内

100%:K
< N <= 100

【NOIP模拟题】Permutation(dp+高精度)的更多相关文章

  1. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  2. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  3. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  4. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  5. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  6. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  7. 【noip模拟题】迎接仪式(dp+特殊的技巧)

    好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’ ...

  8. 【DP】【构造】NOIp模拟题 演讲 题解

        极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...

  9. 【NOIP模拟题】Incr(dp)

    太水的dp没啥好说的.. #include <cstdio> #include <cstring> #include <cmath> #include <st ...

随机推荐

  1. 解决Fiddler不能监听Java HttpURLConnection请求的方法

    在默认情况下,Fiddler不能监听Java HttpURLConnection请求.究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是 在应用程 ...

  2. apple iMac一体机 装双系统 实战! (Apple +Win 7 64bit)Good

    原帖:http://group.zol.com.cn/1/641_485.html 需要准备工具:一个8GU盘X1 (或Win7 安装版系统盘) Windows 7 pro 64bit 位 ISO 文 ...

  3. couldn't find "libstlport_shared.so"

    SUPPORTED_64_BIT_ABIS=[Ljava.lang.String;@9341bd4 BOARD=GEM-703LT BOOTLOADER=unknown TYPE=user match ...

  4. oracle 导入Excel数据

      oracle 导入excel数据 CreateTime--2018年1月30日14:58:51 Author:Marydon 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构 ...

  5. 分享阿里云SLB-负载均衡的实现基本原理架构

    负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...

  6. 零基础小白怎么用Python做表格?

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件.本文用Python3!在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学 ...

  7. VB命令行参数分隔, 类似C语言中的main(int argc, char* argv[])

    VB6.0为了提供命令行参数的支持,提供了Command()接口,于是通过 Command() 函数可以得到所有传入的参数,但是很不友好的是,VB的所有参数都被合在了一起,成为了一个字符串,当有多个参 ...

  8. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

  9. AutoFac文档11(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 元数据 Autofac ...

  10. angularAMD快速入门

    ngularAMD是作者 marcoslin 使用 RequireJS + AngularJS开发的前端mvvm框架,因此你可以使用它快速创建一款Web App.他特别适合快速开发SPA应用,适当的和 ...