【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 ...
随机推荐
- C# list.ForEach用法
list.ForEach(delegate(T model) { ... });
- uboot常用命令详解
dnw:在进入系统之前进入指令行,输入该指令可下载烧录文件. re:重新启动嵌入式系统. printenv:打印当前系统环境变量. setenv:设置环境变量,格式:setenv name value ...
- Python学习笔记4-os,sys模块
一.os模块 import os print(os.getcwd())#取当前工作目录 os.chmod("/usr/local",7)#给文件/目录加权限 print(os.ch ...
- windows设置代理.bat 脚本
按照下列脚本复制到记事本中,保存,重命名后缀为.bat,使用时双击即可. 设置代理.bat,修改下列脚本中的代理地址和端口号 @echo off echo 开始设置IE代理上网 reg add &qu ...
- spring——IOC容器BeanFactory和ApplicationContext对比
- ZigBee介绍
ZigBee网络 什么是ZigBee技术 Zigbee在中国被译为"紫蜂",是一种基于IEEE802.15.4协议的最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有可 ...
- java 连接Kafka报错java.nio.channels.ClosedChannelExcep
Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...
- HDU 4690 EBCDIC 2013 Multi-University Training Contest 9
解题报告:一个模拟题,有两张表格,然后输入一个字符在第一章表格中的位置,让你找出这个字符在第二章表对应的位置. 我欧诺个的是暴力打表,输了两百多个数字,时间复杂度直接降到O(1),这题觉得比较坑的就是 ...
- scrapy 爬虫踩过的坑(II)
同事写了个爬虫,逻辑上看着没什么问题,但是一直报错:Request url must be str or unicode…… 打印了一下url 和url 的类型,确实是 unicode 懵逼…… 打印 ...
- JDK1.8源码LinkedList
引用博文链接 : https://www.cnblogs.com/leskang/p/6029780.html LinkedList继承了 AbstractSequentialList抽象类,而不是像 ...