球(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. DDD实战与进阶 - 值对象

    目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直 ...

  2. linux 正确的关机流程

    查看系统的使用状态 1.使用who命令查看在线用户. 2.使用netstat -a或ss -tnl查看网络状态: 3.使用ps -aux 查看后台运行的程序. 通过上述操作可以了解系统目前使用状态,从 ...

  3. 豆瓣 URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:719)>

    import urllib.request as urlrequest #import ssl#ssl._create_default_https_context = ssl._create_unve ...

  4. 网页解析之BeautifulSoup

    介绍及安装 Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. BeautifulSoup 用来解析 HTML 比较简单,API非常人 ...

  5. Python的import机制

    模块与包 在了解 import 之前,有两个概念必须提一下: 模块: 一个 .py 文件就是一个模块(module) 包: __init__.py 文件所在目录就是包(package) 当然,这只是极 ...

  6. 【Android - 进阶】之Animation补间动画

    补间动画也叫View动画,它只能针对View进行动画操作,且补间动画操作的只是View中可见的部分,即只操作界面,对于可点击区域等都不会进行操作. 在Android中,补间动画的顶级类是Animati ...

  7. Centos 7.x 系统基础优化

    Centos 7.x 系统基础优化 1.更换国内yum源 删除系统带的centos官方yum源 rm -rf /etc/yum.repos.d/* 使用国内阿里云源 curl -o /etc/yum. ...

  8. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】

    Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...

  9. http://t.cn/xxxxx的短链接如何生成?

    var convertStr = encodeURIComponent(urlStr); //转换的原链接可能存在"&"这样的特殊符号,导致原链接的某些字段会被当做ajax ...

  10. Leecode_98_Validate_Binary_Search_Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...