【LOJ】#2061. 「HAOI2016」放棋子
题解
水题,可惜要写高精度有点烦
一看障碍物的摆放方式和最后的答案没有关系,于是干脆不读了,直接二项式反演可以得到
设\(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 <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 200005
#define pb push_back
#define mp make_pair
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
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<class T>
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<int> 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;
}
【LOJ】#2061. 「HAOI2016」放棋子的更多相关文章
- 「HAOI2016」放棋子
题目链接 戳这 前置知识 错位排序 Solution 我们可以观察发现,每一行的障碍位置对答案并没有影响. 于是我们可以将此时的矩阵化成如下形式: \[ 1\ \ 0\ \ 0\ \ 0\\ 0\ \ ...
- 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 ...
- Loj #3042. 「ZJOI2019」麻将
Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
随机推荐
- UIScrollView的contentSize与contentOffset
UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应. ...
- javascript精雕细琢(四):认亲大戏——通过console.log彻底搞清this
目录 引言 代码在前 1.function下的this 2.箭头函数下的this 结语 引言 JS中的this指向一直是个老生常谈,但是新手又容易晕的地方.我在网上浏览了很多帖子,但是发 ...
- 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象
昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...
- android 低功耗蓝牙使用
参考链接:http://blog.csdn.net/xubin341719/article/details/38584469 1.android 手机的低功耗蓝牙,又称BLE :BLE在andriod ...
- debian下配置双核cpu
----------------------------文:jiqing(吉庆) http://hi.baidu.com/jiqing0925email: jiqingwu@gmail.comdate ...
- MySQL Sakila样本数据库
Sakila样本数据库介绍 Sakila样本数据库是MySQL官方提供的一个模拟DVD租赁信息管理的数据库,提供了一个标准模式,可作为书中例子,教程.文章.样品,等等,对学习测试来说是个不错的选择. ...
- python Linux flask uwsgi nginx 在centos7.3部署
0.直接上uwsgi和nginx安装命令 linux 安装uwsgi yum groupinstall "Development tools" yum install zlib-d ...
- app横竖屏切换
问题: 使用react编写的页面,编译后的页面文件打包成app安装后,在手机上显示时,初次横竖屏切换时会出现页面尺寸渲染问题,要跳到其它页面后才能恢复,如图: 由竖屏切换成横屏后页面出现很多空白. 解 ...
- 解决windows文件夹不能自动刷新的问题
我用的是win7系统,最近忽然发现我的文档文件夹里的文件不能自动刷新了,就是当剪切或删除某个文件后,文件夹里的文件没有变化,看起来文件还在原文件夹中,只有通过手动刷新后才能看到效果,该如何解决? 网上 ...
- 关于Unix/Linux的终端、伪终端、控制台和shell
历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...