[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 ...
随机推荐
- Java面向对象学习目录
Java面向对象学习目录 以下为面向对象学习目录,有待补充的部分,我还会再后续的学习过程中加以补充与修改~ 一.面向对象编程思想 二.Java类及类中成员 属性 方法 构造器 代码块 内部类 面向对象 ...
- 新闻实时分析系统-HBase分布式集群部署与设计
HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...
- JavaScript笔记十一
1.DOM查询 - 通过具体的元素节点来查询 - 元素.getElementsByTagName() - 通过标签名查询当前元素的指定后代元素 - 元素.childNodes - 获取当前元素的所有子 ...
- JavaScript基础目录
一.JavaScript简介 1.JavaScript用途 2.JavaScript的诞生 3.JavaScript从丑小鸭到金凤凰 4.JavaScript非常好学 5.学习方法 二.Hello W ...
- python接口自动化测试——简单的文件上传代码实现,人人网登陆后上传图片举例
import requests '''人人网登陆,图片上传 '''def loginData(): '''登录请求参数''' data = { 'email': '13484545195', 'ico ...
- linux bash shell编程之参数变量和流程控制。
参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...
- Django简介以及MVC模式
一.简介 Django,是当前Python世界里最负盛名且成熟的网络框架.最初用来制作在线新闻的Web站点. Django是一个基于python的web重量级框架 重指的是为发开者考虑的多 采用了MV ...
- 设计模式之观察者模式--PHP
列举一个场景:下班之后回家,打开家门,开始做饭,之后睡觉 以上场景如果按照传统的开始方式就是封装一个用户类,里面有回家方法,打开门方法,做饭方法,睡觉方法,之后在外面依次调用. 假设你代码开发完了,这 ...
- ElasticSearch如何一次查询出全部数据—基于Scroll
Elasticsearch 查询结果默认只显示10条,可以通过设置from及size来达到分页的效果(详见附3),但是 from + size <= 10,000,因为index.max_res ...
- Centos 7 启动 Tomcat 7、8 慢的问题
查看原因 首先查看日志信息,查看因为什么而启动慢 在CentOS7启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Se ...