博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LOJ】#2061. 「HAOI2016」放棋子
阅读量:5238 次
发布时间:2019-06-14

本文共 3136 字,大约阅读时间需要 10 分钟。

题解

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

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

\(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!}\)一个阶乘的后缀乘积
所以高精度只要实现高精乘低精,高精加,高精减就可以了

代码

#include 
#define enter putchar('\n')#define space putchar(' ')#define pii pair
#define fi first#define se second#define MAXN 200005#define pb push_back#define mp make_pair//#define ivorysiusing namespace std;typedef long long int64;typedef double db;template
void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 + c - '0'; c = getchar(); }}template
void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) out(x / 10); putchar('0' + x % 10);}const int BASE = 100000000;const int LEN = 8;struct Bignum { vector
v; Bignum(int64 x = 0) { *this = x; } Bignum operator = (int64 x) { v.clear(); do { v.pb(x % BASE); x /= BASE; }while(x > 0); return *this; } friend Bignum operator + (const Bignum &a,const Bignum &b) { Bignum c;c.v.clear(); int p = 0,g = 0,x; while(1) { x = g; if(p < a.v.size()) x += a.v[p]; if(p < b.v.size()) x += b.v[p]; if(!x && p >= a.v.size() && p >= b.v.size()) break; c.v.pb(x % BASE); g = x / BASE; ++p; } return c; } friend Bignum operator - (const Bignum &a,const Bignum &b) { Bignum c;c.v.clear(); int p = 0,g = 0,x; while(1) { x = -g;g = 0; if(p < a.v.size()) x += a.v[p]; if(p < b.v.size()) x -= b.v[p]; if(!x && p >= a.v.size() && p >= b.v.size()) break; if(x < 0) {g = 1;x += BASE;} c.v.pb(x); ++p; } return c; } friend Bignum operator * (const Bignum &a,int64 b) { Bignum c;c.v.clear(); int s = a.v.size(); int64 g = 0; for(int i = 0 ; i < s ; ++i) { int64 x = 1LL * a.v[i] * b + g; c.v.pb(x % BASE); g = x / BASE; } while(g) { c.v.pb(g % BASE); g /= BASE; } return c; } void print() { int s = v.size() - 1; printf("%d",v[s]); for(int i = s - 1 ; i >= 0 ; --i) { printf("%08d",v[i]); } }}fac[205],ans;int N;int main() {#ifdef ivorysi freopen("f1.in","r",stdin);#endif read(N); if(N == 1) {puts("0");return 0;} fac[N + 1] = 1; for(int i = N ; i >= 1 ; --i) { fac[i] = fac[i + 1] * i; } for(int i = 0 ; i <= N ; i += 2) { ans = ans + fac[i + 1]; } for(int i = 1 ; i <= N ; i += 2) { ans = ans - fac[i + 1]; } ans.print(); putchar('\n'); return 0;}

转载于:https://www.cnblogs.com/ivorysi/p/9509850.html

你可能感兴趣的文章
Python深入01 特殊方法与多范式
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
转:apache 的mod-status
查看>>
转:基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
查看>>
结对编程博客
查看>>
IOS开发之----异常处理
查看>>
Java-静态代码块,构造代码块,构造函数
查看>>
sort equal 确保记录按照 input顺序来
查看>>
反射的作用
查看>>
Android——子线程操作主线程
查看>>
菜鸟程序员怎么才能提高自己的技术--(献给自己共勉)
查看>>
Kendo MVVM 数据绑定(四) Disabled/Enabled
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
C++11 生产者消费者
查看>>
IO multiplexing 与 非阻塞网络编程
查看>>
hdu4105  Electric wave
查看>>