[JZOJ A组]球 题解
球(ball)
【问题描述】
小 T 有 n 个桶和 2n − 1 个球,其中第 i 个桶能装前 2i − 1 个球。每个桶只能装一个球。
现在小 T 取了 m 个桶和 m 个球,并将这些球各自放在这些桶里。问这样的方案有多少。
两种方案不同当且仅当选择了不同的桶或球或者同一个桶在两种方案放了不同的球。
由于方案的数量可能很大,所以只需要求方案数模 998244353 后的结果。
【输入格式】
从输入文件 ball.in 中读入数据。
第一行一个整数 T,表示数据组数。
接下来 T 行,每行两个整数 n, m,含义见【问题描述】。
【输出格式】
输出到文件 ball.out 中。
输出共 T 行,每行一个整数表示一组数据的答案。
【样例 1 输入】
4
1 1
2 1
2 2
3 2
【样例 1 输出】
1
4
2
18
【样例 1 说明】
对于 n = m = 1 的情况,只有选择第一个球和第一个桶,并将第一个球放在第一个桶里这一种方案。
对于 n = 2, m = 2 的情况,会选择所有桶,第一个桶里放的一定是第一个球,于是第二个桶里可以放第二个或第三个球,共两种方案。
【样例 2 输入】
4
1000 1
10000 1
100000 1
1000000 1
【样例 2 输出】
1000000
100000000
17556470
757402647
【子任务】
保证 1 ≤ T ≤ 1E5, 1 ≤ m ≤ n ≤ 1E7。
首先看到\(10^7\)的数据和仅有2个参数的较多询问,马上想到这是一道和预处理阶乘有关的题。
然后看题目,是一道计数题,结合前面的想法,预估是一道数学题,且很可能是结论题
然后就分析一下,桶可以选择的球的区间存在包含关系,前面的桶选择一个球放入后,后面的桶可选择的球就会减1,用式子表达即
\]
对这种变量不重复的枚举方式,有一个常用的化法,就是反过来枚举,使每个变量的下界为\(1\),方便后续化简
\]
直接把每一项提出去得
\]
emm然后发现,这样的式子,从末尾开始,每一个求和都只与前一个求和给的变量有关,如果我们对最后一个求和预处理一下,然后用它来处理倒数第2个求和,然后用这来出来倒数第3个求和......处理到最后就是答案了!
实现就一个二维的dp
f(i,i-1) = 0 \\
f(i,j) = f(i,j-1) + (2j-i)f(i-1,j-1)
\]
那么,最终答案就是\(f(m,n)\)
这样就可以获得70分
观察推出来的式子,是不是挺像组合数的递推式?
考虑打表出\(f\)矩阵找规律
发现\(f(i,i) = i!\),对每行都除掉他
发现每一个数字都是完全平方数,开方后就成为一个近似杨辉三角的东西
于是愉快的发现了规律。
\]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll MOD=998244353;
ll QPow(ll x,ll up){
x%=MOD;
ll ans=1;
while(up)
if(up%2==0) x=x*x%MOD,up/=2;
else ans=ans*x%MOD,up--;
return ans;
}
ll Inv(ll x){return QPow(x,MOD-2);}
const ll MXN=1E7+5;
ll fac[MXN];
ll facInv[MXN];
void SpawnFac(ll sz){
fac[0]=1;for(ll i=1;i<=sz;i++) fac[i]=fac[i-1]*i%MOD;
facInv[sz]=Inv(fac[sz]);
for(ll i=sz-1;i>=1;i--) facInv[i]=facInv[i+1]*(i+1)%MOD;
facInv[0]=1;
}
ll C(ll n,ll m){
if(n<m) return 0;
return fac[n]*facInv[m]%MOD*facInv[n-m]%MOD;
}
int main(){
//freopen("ball.in","r",stdin);
//freopen("ball.out","w",stdout);
SpawnFac(1E7+1);
ll T;scanf("%lld",&T);while(T--){
ll n,m;scanf("%lld%lld",&n,&m);
ll ans=fac[m]*C(n,m)%MOD*C(n,m)%MOD;
printf("%lld\n",ans);
}
return 0;
}
这个结论题还是蛮有意思的,推导套路值得思考
关于该结论的证明:

反正我是没有看懂(
[JZOJ A组]球 题解的更多相关文章
- 【题解】NOIP2017 提高组 简要题解
[题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- [JZOJ]2109 清兵线 题解
## [JZOJ]2109 清兵线 题解 **FIRST 题目大意** 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m- ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 2010年NOIP普及组复赛题解
题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...
- NOIP2017提高组day2T1题解(奶酪)
题目链接:奶酪 这道题还是很水的,在下拿了满分. 并没有用什么高级的算法,我讲一下基本思路. 我们把每个洞都视为一个节点. 我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张 ...
- NOIP2017普及组T2题解
还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...
- 2018年江西理工大学C语言程序设计竞赛高级组部分题解
B Interesting paths 考察范围:组合数学 此题是机器人走方格的变种,n*m的网格,从(1,1)走到(n,m),首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条 ...
- 2017年NOIP普及组复赛题解
题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...
随机推荐
- python CGI编程---Apache服务安装(2)
一.下载Apache 下载地址:https://www.apachehaus.com/cgi-bin/download.plx 我这里下载第一个,我电脑是window的64位. 下载完成后,解压到 我 ...
- 剖析nsq消息队列目录
剖析nsq消息队列(一) 简介及去中心化实现原理 剖析nsq消息队列(二) 去中心化源码解析 剖析nsq消息队列(三) 消息传输的可靠性和持久化[一] 剖析nsq消息队列(三) 消息传输的可靠性和持久 ...
- 2019-10-8:渗透测试,基础学习,php基础,会话,文件包含,笔记
php面向对象基础->调用符号构造函数construct,主要用来创建对象时初始化对象,为成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 析构函数destructor,与构造函数相 ...
- scrapy抓取中国新闻网新闻
目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...
- 分布式远程调用SpringCloud-Feign的两种具体操作方式(精华)
一 前言 几大RPC框架介绍 1.支持多语言的RPC框架,google的gRPC,Apache(facebook)的Thrift 2.只支持特定语言的RPC框架,例如新浪的Motan 3.支持服务治理 ...
- re实战记录
re实战记录 针对网页中的空格符 一般使用的.,但是它不能匹配\n,所以使用[\s\S]或者[\d\D]匹配所有字符 import re l1=r''' <div class="thu ...
- Reachability的用法 判断用户的网络状态
- (void)viewDidLoad { [super viewDidLoad]; // 监听网络状态发生改变的通知 [[NSNotificationCenter defaultCenter] ad ...
- 《手把手教你》系列练习篇之8-python+ selenium自动化测试 -压台篇(详细教程)
1. 简介 本文是练习篇的最后一篇文章,虽然练习篇的文章到此就要和大家说拜拜了,但是我们的学习之路才刚刚开始.不要停下你的脚步,大步朝前走吧!比你优秀的人还在走着,我们有什么理由停下自己的脚步了,生命 ...
- 鲲鹏性能优化十板斧——鲲鹏处理器NUMA简介与性能调优五步法
TaiShan特战队六月底成立,至今百日有余,恰逢1024程序员节,遂整理此文,献礼致敬!希望能为广大在鲲鹏处理器上开发软件.性能调优的程序员们,提供一点帮助.从今天开始,将陆续推出性能调优专题文章. ...
- 技术谈 | SDN 和 NFV 之间的爱与恨
部分开发者经常混淆 SDN 和 NFV,无法看清他们的关系.今天,小编搬出华为技术专家的一篇大稿,给大家掰扯掰扯:SDN 和 NFV 究竟是什么关系. ----文/闫长江 什么是 SDN 回到基本的概 ...