题解

水题,可惜要写高精度有点烦

一看障碍物的摆放方式和最后的答案没有关系,于是干脆不读了,直接二项式反演可以得到

设\(g_k\)为一种摆放方式恰好占了k个障碍物

\(f_k = \sum_{i = k}^{n} \binom{i}{k} g_{i}\)

可以得到

\(g_0 = \sum_{k = 0}^{n} (-1)^{k} \binom{k}{0} f_{i}\)

\(g_0 = \sum_{k = 0}^{n} (-1)^{k} \binom{n}{k} (n - k)!\)

拆开可以发现后面就是 \(\frac{n!}{k!}\)一个阶乘的后缀乘积

所以高精度只要实现高精乘低精,高精加,高精减就可以了

代码

  1. #include <bits/stdc++.h>
  2. #define enter putchar('\n')
  3. #define space putchar(' ')
  4. #define pii pair<int,int>
  5. #define fi first
  6. #define se second
  7. #define MAXN 200005
  8. #define pb push_back
  9. #define mp make_pair
  10. //#define ivorysi
  11. using namespace std;
  12. typedef long long int64;
  13. typedef double db;
  14. template<class T>
  15. void read(T &res) {
  16. res = 0;T f = 1;char c = getchar();
  17. while(c < '0' || c > '9') {
  18. if(c == '-') f = -1;
  19. c = getchar();
  20. }
  21. while(c >= '0' && c <= '9') {
  22. res = res * 10 + c - '0';
  23. c = getchar();
  24. }
  25. }
  26. template<class T>
  27. void out(T x) {
  28. if(x < 0) {x = -x;putchar('-');}
  29. if(x >= 10) out(x / 10);
  30. putchar('0' + x % 10);
  31. }
  32. const int BASE = 100000000;
  33. const int LEN = 8;
  34. struct Bignum {
  35. vector<int> v;
  36. Bignum(int64 x = 0) {
  37. *this = x;
  38. }
  39. Bignum operator = (int64 x) {
  40. v.clear();
  41. do {
  42. v.pb(x % BASE);
  43. x /= BASE;
  44. }while(x > 0);
  45. return *this;
  46. }
  47. friend Bignum operator + (const Bignum &a,const Bignum &b) {
  48. Bignum c;c.v.clear();
  49. int p = 0,g = 0,x;
  50. while(1) {
  51. x = g;
  52. if(p < a.v.size()) x += a.v[p];
  53. if(p < b.v.size()) x += b.v[p];
  54. if(!x && p >= a.v.size() && p >= b.v.size()) break;
  55. c.v.pb(x % BASE);
  56. g = x / BASE;
  57. ++p;
  58. }
  59. return c;
  60. }
  61. friend Bignum operator - (const Bignum &a,const Bignum &b) {
  62. Bignum c;c.v.clear();
  63. int p = 0,g = 0,x;
  64. while(1) {
  65. x = -g;g = 0;
  66. if(p < a.v.size()) x += a.v[p];
  67. if(p < b.v.size()) x -= b.v[p];
  68. if(!x && p >= a.v.size() && p >= b.v.size()) break;
  69. if(x < 0) {g = 1;x += BASE;}
  70. c.v.pb(x);
  71. ++p;
  72. }
  73. return c;
  74. }
  75. friend Bignum operator * (const Bignum &a,int64 b) {
  76. Bignum c;c.v.clear();
  77. int s = a.v.size();
  78. int64 g = 0;
  79. for(int i = 0 ; i < s ; ++i) {
  80. int64 x = 1LL * a.v[i] * b + g;
  81. c.v.pb(x % BASE);
  82. g = x / BASE;
  83. }
  84. while(g) {
  85. c.v.pb(g % BASE);
  86. g /= BASE;
  87. }
  88. return c;
  89. }
  90. void print() {
  91. int s = v.size() - 1;
  92. printf("%d",v[s]);
  93. for(int i = s - 1 ; i >= 0 ; --i) {
  94. printf("%08d",v[i]);
  95. }
  96. }
  97. }fac[205],ans;
  98. int N;
  99. int main() {
  100. #ifdef ivorysi
  101. freopen("f1.in","r",stdin);
  102. #endif
  103. read(N);
  104. if(N == 1) {puts("0");return 0;}
  105. fac[N + 1] = 1;
  106. for(int i = N ; i >= 1 ; --i) {
  107. fac[i] = fac[i + 1] * i;
  108. }
  109. for(int i = 0 ; i <= N ; i += 2) {
  110. ans = ans + fac[i + 1];
  111. }
  112. for(int i = 1 ; i <= N ; i += 2) {
  113. ans = ans - fac[i + 1];
  114. }
  115. ans.print();
  116. putchar('\n');
  117. return 0;
  118. }

【LOJ】#2061. 「HAOI2016」放棋子的更多相关文章

  1. 「HAOI2016」放棋子

    题目链接 戳这 前置知识 错位排序 Solution 我们可以观察发现,每一行的障碍位置对答案并没有影响. 于是我们可以将此时的矩阵化成如下形式: \[ 1\ \ 0\ \ 0\ \ 0\\ 0\ \ ...

  2. loj2061 「HAOI2016」放棋子

    答案就是错排数 n = int(input()) f = [0] * 205 f[0] = 1 for i in range(2, n+1): f[i] = (i-1) * (f[i-1] + f[i ...

  3. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. day11 细节记忆

    单一职责:一个方法只做一件事. 值传递——java只有值传递. gender(性别) male(男)female(女) 自动生成的set.get方法中,布尔类型的get方法需要手工改为get(默认是i ...

  2. Spring MVC处理响应的 header

    我们经常需要在HttpResponse中设置一些headers,我们使用Spring MVC框架的时候我们如何给Response设置Header呢? So easy, 看下面的代码: @Request ...

  3. Java并发编程原理与实战十八:读写锁

    ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程. 基本规则: 读读不互斥 ...

  4. 关于JavaScript代码的执行效率总结

    Javascript是一门非常灵活的语言,我们可以随心所欲的书写各种风格的代码,不同风格的代码也必然也会导致执行效率的差异,开发过程中零零散散地接触到许多提高代码性能的方法,整理一下平时比较常见并且容 ...

  5. 20155330 2016-2017-2 《Java程序设计》第七周学习总结

    20155330 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 学习目标 了解Lambda语法 了解方法引用 了解Fucntional与Stream API ...

  6. Is It A Tree? 挂着并查集的帽子招摇撞骗

    Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a ...

  7. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  8. 一个简单的java jdbc案例

    有些时候,配置一个spring+mybatis框架,然后写xml,dao ,service显得特别繁琐. 如果我们只是想查一下数据库,不考虑连接复用也不考虑动态sql,可以用原生的jdbc来实现,方便 ...

  9. RobotFramework安装扩展库包Selenium2Library(三)

    Robot Framework扩展库包 http://robotframework.org/#libraries 一,自动化测试web端 1,pip安装SeleniumLibrary pip inst ...

  10. redhat6.5文件共享

    以下操作均需要root用户 a端: 固定nfs端口 #vi /etc/sysconfig/nfs 将里面的RQUOTAD_PORT.LOCKD_TCPPORT.LOCKD_UDPPORT.MOUNTD ...