BZOJ#Q0555. 能源晶体题解
Description
在一个遥远的未来,人类已经进入了星际时代,各大星系之间依靠一种稀有的能源晶体来维持星 际飞船的运行。这种能源晶体极其珍贵且具有强大的能量,能够为整个星际舰队提供动力。
Luke 是银河联邦的一名高级能源工程师,他的任务是管理和调配这些稀有的能源晶体。联邦给他 分配了 nn 个高能晶体模块,这些模块需要放入 kk 个能量储存舱中。每个储存舱必须至少分配一个 高能晶体模块,以保证没有浪费。
由于晶体能量的特殊性质,不同的分配方式会导致能量场的不同排列。这些排列在维持星际平衡 中起着至关重要的作用。因此,Luke 需要找出所有可能的晶体分配方式,并计算它们的总数。 然而,星际能源系统的复杂性极高,可能的分配方案数非常庞大,因此计算结果需要对 998244353998244353 取模,确保数据在银河级计算机中能够正常处理。
作为银河联邦的重要工程师,Luke 需要你的帮助来完成这项艰巨的任务!你能帮助他计算出所有 可能的分配方式并确保星际平衡吗?
Format
Input
第一行输入两个正整数 n,kn,k。
Output
输出一行一个整数表示计算结果对 998244353998244353 取模的结果。
Samples
输入数据 1
7 3
Copy
输出数据 1
4
Copy
共有 (1,1,5),(1,2,4),(1,3,3),(2,2,3)(1,1,5),(1,2,4),(1,3,3),(2,2,3) 四种情况
Limitation
对于 100%100% 的数据:1≤k≤n≤50001≤k≤n≤5000。
| 测试点编号 | nn | kk |
|---|---|---|
| 11 | ≤200≤200 | ≤6≤6 |
| 22 | ||
| 33 | ||
| 44 | ≤200≤200 | |
| 55 | ||
| 66 | ||
| 77 | ≤5000≤5000 | ≤n≤n |
| 88 | ||
| 99 | ||
| 1010 |
思路
DP即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
int n,k,f[5001][5001],mod=998244353,ff=0;
long long abc(long long a1,long long b1){
if(a1==b1&&a1>0) return 1;
if(a1<b1||a1<=0||b1<=0) return 0;
if(f[a1][b1]>=0) return f[a1][b1];
long long lk=0;
lk+=abc(a1-1,b1-1);
lk+=abc(a1-b1,b1);
f[a1][b1]=lk%mod;
return f[a1][b1];
}
int main(){
cin>>n>>k;
memset(f,-1,sizeof(f));
cout<<abc(n,k)<<endl;
return 0;
}

浙公网安备 33010602011771号