@description@

求有多少对 1 ∼ n 的排列 (a, b) 满足 \(m \le \sum_{i=1}^{n}\max(ai, bi)\)。

两个方案 (a, b) 和 (a′, b′) 不同当且仅当存在 i 使得 \(ai\not =a′i\)或 \(bi\not =b'i\)。

input

一行两个整数 n, m。

output

一行一个整数表示答案。对 998244353 取模。

sample input

3 8

sample output

18

对于100%的数据,1≤n≤50,1≤m≤10^9。

@solution@

根据我多年 OI 经验,题目短的不是水就是毒瘤。

但是这一次我好像A了这道题。

看到998244353是不是感觉整个人都不好了。

可以发现 a 中元素与 b 中元素的一一对应的关系确定了 \(\sum_{i=1}^{n}\max(ai, bi)\)。

所以我们可以只统计 a 与 b 中元素对应关系合法的方案,再乘上 n! 表示全排列。

另外还可以发现,题目所给的和式其中一个上界为 n*n(可以发现这是一个不是很紧的上界,但足够了)。故当 m > n*n 时直接输出 0 就好了。

当 m <= n*n 时,可以对于所有可能的 m ,计算 \(\sum_{i=1}^{n}\max(ai, bi)=m\) 的方案数然后进行累加。

我们为了保证 max 函数的唯一性,不妨令 ai >= bi 时 max(ai, bi) = ai;ai < bi 时 max(ai, bi) = bi。

考虑 a 中的 i,它要对答案产生贡献,只能和 b 中的 1 ~ i 配对;同样,对于 b 中的 i 要产生贡献,只能和 a 中的 1 ~ i-1 配对。

于是我们可以从小到大,考虑每一个数 i 在 a 序列与 b 序列中是否会对答案产生贡献。我们只需要知道在 i 之前有多少数未被配对。

由于 a 与 b 是一一配对,所以 a 中未配对的元素个数一定等于 b 中未配对的元素个数。

由此自然得出 dp 的状态定义:dp[i][j][k] 表示考虑到 i,i 之前 a/b 中有 j 个数还未被配对,此时凑出的和为 k。

通过分类讨论 a 中的 i 是否有贡献以及 b 中的 i 是否有贡献,得到四类转移。

注意当 a 中的 i 与 b 中的 i 相匹配时,根据上文的讨论 b 中的 i 是没有贡献的。

时间复杂度 O(n^4)。

@accepted code@

#include<cstdio>
const int MOD = 998244353;
const int MAXN = 50;
int dp[MAXN + 5][MAXN + 5][MAXN*MAXN + 5];
int main() {
int n, m; scanf("%d%d", &n, &m);
if( m > n*n ) {
puts("0");
return 0;
}
int ans = 1;
for(int i=1;i<=n;i++)
ans = 1LL*i*ans%MOD;
dp[0][0][0] = 1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=i;j++)
for(int k=0;k<=n*n;k++)
dp[i][j][k] = (dp[i][j][k] + dp[i-1][j-1][k])%MOD;
for(int j=0;j<i;j++)
for(int k=i;k<=n*n;k++)
dp[i][j][k] = (dp[i][j][k] + 1LL*j*dp[i-1][j][k-i]%MOD)%MOD;
for(int j=0;j<i;j++)
for(int k=i;k<=n*n;k++)
dp[i][j][k] = (dp[i][j][k] + 1LL*(j+1)*dp[i-1][j][k-i]%MOD)%MOD;
for(int j=0;j<i-1;j++)
for(int k=2*i;k<=n*n;k++)
dp[i][j][k] = (dp[i][j][k] + 1LL*(j+1)*(j+1)%MOD*dp[i-1][j+1][k-2*i]%MOD)%MOD;
}
int res = 0;
for(int i=m;i<=n*n;i++)
res = (res + dp[n][0][i])%MOD;
printf("%lld\n", 1LL*ans*res%MOD);
}

@details@

就代码而言写起来还是很愉快的,甚至不足 1kb。

然而我当时好像一不小心把 m ≤ …… 看成 m = ……

不过还好最后改过来了,不然就直接炸掉了。。。

@noi.ac - 170@ 数数的更多相关文章

  1. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

  2. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  3. 【BZOJ3530】数数(AC自动机,动态规划)

    [BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...

  4. bzoj [Sdoi2014]数数 AC自动机上dp

    [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1264  Solved: 636[Submit][Status][Discu ...

  5. [SDOI2014]数数 --- AC自动机 + 数位DP

    [SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...

  6. [Sdoi2014]数数[数位dp+AC自动机]

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 834  Solved: 434[Submit][Status][ ...

  7. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  8. NOI.ac #31 MST DP、哈希

    题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...

  9. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

随机推荐

  1. html5的离线存储问题集合

    HTML5的离线存储使用一个manifest文件来标明哪些文件是需要被存储的,使用如 来引入一个manifest文件,这个文件的路径可以是相对的,也可以是绝对的,如果你的web应用很多,而且希望能集中 ...

  2. JS常用属性方法大全

    1. 输出语句 : document.write(""); 2.JS 中的注释为 : // 3. 传统的 HTML 文档顺序是 : document->html->(h ...

  3. poj 2406 Power Strings(KMP入门,next函数理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 37685   Accepted: 15590 D ...

  4. 修改Eclipse自动换行长度

    使用Ctrl+Shift+F自动格式化代码的时候,有时候折行太多反而让代码看起来更乱,不容易阅读. 解决办法: Window-->Preferences-->Java-->Code ...

  5. 移动端的vh 和 vw简介和使用场景

    vw 相对于视窗的宽度:视窗宽度是100vw:vh则类似,是相对于视窗的高度,视窗高度是100vh. 这里的视窗指的又是啥? 是浏览器内部宽度大小(window.innerWidth)? 是整个浏览器 ...

  6. linuxtoy.org资源

    https://linuxtoy.org/archives.html Archives 在 Android 系统上安装 Debian Linux 与 R (2015-07-14) Pinos:实现摄像 ...

  7. 基于matlab的傅里叶变换

    原文出处https://blog.csdn.net/qq_37366291/article/details/79832886 例子1 作用:使用傅里叶变换找出隐藏在噪声中的信号的频率成分.(指定信号的 ...

  8. Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画

    原文:Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画 或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?层 ...

  9. android GUI 流程记录

    ViewRootImpl 与 wms ViewRootImple里的 WindowSeesion是WindowManagerService的proxy, 通过这个句柄来调用WMS的功能而W是 wms用 ...

  10. docker-其它命令

    [root@iZ943kh74qgZ soft]# docker Usage: docker COMMAND A self-sufficient runtime for containers Opti ...