球(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,用式子表达即

\[Ans= \sum_{i_1 = 1}^n \sum_{i_2 = i_1+1}^n \sum_{i_3 = i_2+1}^n ... \sum_{i_m = i_{m-1}+1}^n (2 i_1 - 1)(2 i_2 - 2) ... (2i_m - m)
\]

对这种变量不重复的枚举方式,有一个常用的化法,就是反过来枚举,使每个变量的下界为\(1\),方便后续化简

\[\sum_{i_m = m}^{n} \sum_{i_{m-1} = m-1}^{i_m -1} \sum_{i_{m-2} = m-2}^{i_{m-1} -1} ... \sum_{i_{2} = 2}^{i_{3} -1} \sum_{i_{1} = 1}^{i_{2} -1} (2 i_1 - 1)(2 i_2 - 2) ... (2i_m - m)
\]

直接把每一项提出去得

\[\sum_{i_m = m}^{n} (2i_m - m) \sum_{i_{m-1} = m-1}^{i_m -1} (2i_{m-1} - (m-1)) ... \sum_{i_{2} = 2}^{i_{3} -1} (2 i_2 - 2) \sum_{i_{1} = 1}^{i_{2} -1} (2 i_1 - 1)
\]

emm然后发现,这样的式子,从末尾开始,每一个求和都只与前一个求和给的变量有关,如果我们对最后一个求和预处理一下,然后用它来处理倒数第2个求和,然后用这来出来倒数第3个求和......处理到最后就是答案了!

实现就一个二维的dp

\[f(0,j) = 1 \\
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!\),对每行都除掉他

发现每一个数字都是完全平方数,开方后就成为一个近似杨辉三角的东西

于是愉快的发现了规律。

\[Ans = m! (C_n^m)^2
\]

#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组]球 题解的更多相关文章

  1. 【题解】NOIP2017 提高组 简要题解

    [题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...

  2. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  3. [JZOJ]2109 清兵线 题解

    ## [JZOJ]2109 清兵线 题解 **FIRST 题目大意** 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m- ...

  4. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  5. 2010年NOIP普及组复赛题解

    题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...

  6. NOIP2017提高组day2T1题解(奶酪)

    题目链接:奶酪 这道题还是很水的,在下拿了满分. 并没有用什么高级的算法,我讲一下基本思路. 我们把每个洞都视为一个节点. 我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张 ...

  7. NOIP2017普及组T2题解

    还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...

  8. 2018年江西理工大学C语言程序设计竞赛高级组部分题解

    B Interesting paths 考察范围:组合数学 此题是机器人走方格的变种,n*m的网格,从(1,1)走到(n,m),首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条 ...

  9. 2017年NOIP普及组复赛题解

    题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...

随机推荐

  1. 找到了element, 但是用getText却得到空值,取不到文本的解决办法

    最近代码中发现一些bug, 在Debug过程中发现,页面元素是被定位到了,但是用getText方法取到的却是空值.调查了一下发现,getText是否返回值和isDisplayed是否为true有关.当 ...

  2. windows下的nginx应用

    nginx(背景) nginx是一个高性能的HTTP服务器,以前我经常在linux系统中配置,主要做反向代理和负载均衡,最近根据业务需要,需要在window中配置反向和负载,下面就介绍一下nginx的 ...

  3. Windows之Java开发环境快速搭建

    说明:Node.js非必须,通常中小公司或创业公司,基本上都要求全栈. 补充说明: 除此之外,当公司固定JDK.Maven.Idea.Git.Node.js及其相关IDE等版本时,运维人员或者Team ...

  4. requests请求库练习--GitHub登录

    # coding = utf-8 """ 结合抓包工具,采用两种方法模拟登录github直接利用session登录和利用requests登录 ""&q ...

  5. nginx实现前后台分离部署

    2.1         前后台分离部署 (一)       组网图 (二)       简要说明: 如标题所示,至于为什么要前后台分离部署,个人理解的原因有三 (一)   便于部署 前台代码由ngin ...

  6. django-formset实现数据表的批量操作

    什么是formset 我们知道forms组件是用来做表单验证,更准确一点说,forms组件是用来做数据库表中一行记录的验证.有forms组件不同,formset是同科同时验证表中的多行记录,即form ...

  7. java前端与后端怎么选??

    想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效.我知道一些刚刚入行的小伙伴不清楚前端.后端.到底指的是什么?两者直接的区别 前端开发 前端开发主要涉及网站和App,用户能够从浏览器上或A ...

  8. 关于Python的随机数模块,你必须要掌握!

    所谓七夕 前几天的文章这个七夕节,用Python为女友绘制一张爱心照片墙吧!收获了最近以来最高的浏览量,没枉费我熬到夜里3点赶出来的热点文章.有付出就总会有所回报,只是看这天来的早晚而已.七夕一个人看 ...

  9. mac install: /usr/bin/unrar: Operation not permitted

    按照教程mac下解压缩rar文件工具-rarosx(免费),在mac上安装rar,在执行命令 sudo install -c -o $USER unrar /bin 出现错误:install: /bi ...

  10. 记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs

    首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大 ...