组合计数 ---- 732 Div2 D. AquaMoon and Chess
题目链接
题目大意:
就是给你一个1×n1\times n1×n的棋盘,上面初始状态下有若干个棋子,对于每个棋子有可以有两种移动的条件(假设第iii个位置上有一枚棋子)
- 棋子可以移动到i+2i+2i+2的位置上,如果i+1i+1i+1的位置上有棋子,第i+2i+2i+2上没有棋子,并且i+2i+2i+2没有超过nnn
- 棋子可以移动到i−2i-2i−2的位置上,如果i−1i-1i−1的位置上有棋子,第i−2i-2i−2上没有棋子,并且i−2i-2i−2没有低过000
现在给你棋盘的初始状态,问你棋盘有多少种可达的状态?
解题思路:
首先我们发现对于某个1,我们都是两个两个成为一组的移动的,因为每个棋子都是一样的,那么我们发现,对于上面的1和2的操作实际上就是把这两个棋子左右平移一个单位而已。对于单个的棋子是无法移动的
我们手动模拟一下:
eg.
01110 分组 0 11 1 0 ,现在可以分成4块
cg = 1:是可移动的块的数量
c0 = 2:0的数量
c1 = 1:单个1的数量
那么这个棋盘可达的状态有ans=C(cg+c0,cg)ans=C(cg+c0,cg)ans=C(cg+c0,cg);
因为我们知道对于单个1的位置是不用考虑的因为,如果在所有的可移动的棋子固定下来后,单个1的位置也是唯一确实的!!
那么上面就相当于从3块中选出1块放111111的方案数
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 998244353;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int n;
char str[maxn];
ll inv[maxn], rf[maxn];
int main() {IOS;int T;cin >> T;inv[1] = 1;rf[1] = 1;for(int i = 2; i < maxn; ++ i) inv[i] = 1ll*(mod-mod/i)*inv[mod%i]%mod;for(int i = 2; i < maxn; ++ i) inv[i] = inv[i] * inv[i-1] % mod;//处理阶乘的逆元for(int i = 2; i < maxn; ++ i) rf[i] = 1ll * i * rf[i - 1] % mod;//处理阶乘while(T--) {cin >> n;cin >> str;int c0 = 0, cg = 0;for(int i = 0;i < n; ++ i) {if(str[i] == '1') {int ep = 0;while(i + ep < n && str[i+ep] == '1') ep ++;i = i + ep - 1;cg = cg + ep / 2;} else c0 ++;}ll ans = rf[cg + c0] * inv[cg] % mod * inv[c0] % mod;cout << ((ans == 0) ? 1 : ans) << endl;}
}
组合计数 ---- 732 Div2 D. AquaMoon and Chess相关推荐
- Codeforces Round #732 (Div. 2) D. AquaMoon and Chess 组合数学 + 找规律
传送门 文章目录 题意: 思路: 题意: 给你一个010101串,当且仅当某个111的某一边i+1,i−1i+1,i-1i+1,i−1有111,这个111可以跟i+2,i−2i+2,i-2i+2,i− ...
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- CF1237F Balanced Domino Placements(组合计数,dp)
CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...
- 【Luogu4921】情侣?给我烧了!(组合计数)
[Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...
- 1307 牡牛和牝牛(组合计数-递推)
1. 问题描述: 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛.请计算 ...
- 学组合数学心得与题解(一)——组合计数
今天我在某网站上稍微学习了一下组合数学,准确来讲,今天就看了看组合计数.像一些弱智的排列数.组合数大家肯定在小学奥数就已经精通了(只有我这种蒟蒻忘的精光).当然,博主比较菜,连二项式定理.帕斯卡恒等式 ...
- 基础组合计数常用的概念和方法总结
基础组合计数常用的概念和方法总结 一.组合计数中的基本概念与性质 1.排列 定义 性质 2.组合 定义 性质 二.组合计数中的一些常用技巧 1.容斥原理 定义 公式 2.捆绑与插空法 捆绑法 插空法 ...
- 数学知识——组合计数
组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...
最新文章
- linux mysql 健康检查_Linux下检查MySQL的Slave是否正常
- javascript写计数器
- centos7安装uwsgi报错_如何将CentOS 7升级到CentOS 8
- 【转】SyntaxError: Non-ASCII character ‘\xe5′ in file
- Android 雪花飘落动画效果 自定义View
- python课后题答案第二章_Python编程:从入门到实践——练习题答案(第二章)
- 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】
- CANFD MCP2517FD 滤波ID设置例子
- C语言中32个关键字详解
- magicdraw 2022x
- UE4 为简易的房子添加内饰
- MII、 RMII、 GMII、 RGMII 接口介绍
- Fping命令批量ping地址
- jasperprint 设置横向打印
- EVA2.0:大规模中文开放域对话预训练模型
- linux编程 —— shell编程脚本常用语法总结 【学习笔记】
- 2023年软考网络工程师考试备考指南
- windows_server_2008镜像文件
- Php大马的简单解密[技巧]
- 2.5、组织结构对项目的影响
热门文章
- 王爽 汇编语言第三版 监测点9.2 监测点9.3 补全编程,利用jcxz指令,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,
- MATLAB_no.1:入门作业_histeq():_imhist()_(男孩的三个图,以及文字描述)
- Opencv实现透视形变
- 深度学习100问:图像语义分割有哪些经典的上采样方法?
- 使用OpenCV校准鱼眼镜头-第2部分
- 链表问题16——单链表的选择排序
- 求最小Hamming距离的DNA序列
- Python-ORM实战
- 浅谈tidb事务与MySQL事务之间的区别
- 从Java到Spring为何独得青睐Spring Summit 2017不可不知的那些事儿