球(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. 解决无法定位软件包 或 install net-tools

    解决无法定位软件包  或  install net-tools  当我们安装好Linux后,因为里面有很多功能服务没有安装(如ifconfig.vsftpd) 所以出现一些command  '**** ...

  2. 【2018寒假集训 Day2】【动态规划】挖地雷

    挖地雷(Mine) 在一个地图上有N 个地窖(N<=200),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径,并规定路径都是单向的,且从编号小的地窖通向编号大的地窖.某人可以从任一处 ...

  3. scrapy抓取中国新闻网新闻

    目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...

  4. TensorBoard:可视化学习

    数据序列化 TensorBoard 通过读取 TensorFlow 的事件文件来运行.TensorFlow 的事件文件包括了你会在 TensorFlow 运行中涉及到的主要数据.下面是 TensorB ...

  5. HashMap面试题,看这一篇就够了!

    目录 序言 一.JDK7中的HashMap底层实现 1.1 基础知识 1.2 put()方法 1.2.1 特殊key值处理 1.2.2 扩容 1.2.3 如何计算bucket下标? 1.2.4 在目标 ...

  6. ASP.NET Core 中的 ObjectPool 对象重用(二)

    前言 上一篇文章主要介绍了ObjectPool的理论知识,再来介绍一下Microsoft.Extensions.ObjectPool是如何实现的. 核心组件 ObjectPool ObjectPool ...

  7. centos7安装samba

    samba是一个实现smb协议的开源软件,为局域网内的不同计算机之间提供文件和打印机共享服务. 1.安装yum groupinstall “file-server” -y 2.配置cp /etc/sa ...

  8. luogu P2345 奶牛集会 |排序+树状数组

    题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为X ...

  9. bug小结

    在不同的文件下面可以创建同一个包,但是不能创建同一个class文件!!!   ParameterType:需要写实体类的类型,最好不要写实体的别名 这是因为我们在配置mybatis的配置文件时已经说明 ...

  10. BZOJ2440完全平方数(莫比乌斯反演)

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...