NC221199. 小圆前辈的暴力枚举
描述
小圆前辈家有一个n * m的矩阵,对于矩阵上的每一个格子,你都可以放置一个棋子(易知总共有种放置情况)。小圆前辈想知道,在所有放置情况中有多少种情况满足:对于矩阵的每一行且每一列至多只有1个棋子。小圆前辈一想,这不是暴力枚举一下就行了,于是便把问题交给你了,你能求出答案是多少吗。
结果对998244353取模。
输入描述
一行只有两个整数,n和m。
输出描述
一个整形数表示答案。
示例1
输入:
2 2
输出:
7
说明:
在2 * 2的矩阵中我们可以找到
且无法找到更多合法方案。
C++(g++ 7.5.0) 解法, 执行用时: 10ms, 内存消耗: 8308K, 提交时间: 2023-02-26 15:52:15
#include<bits/stdc++.h> using namespace std; #define int long long const int mod=998244353; const int N=1e3+10; int f[N][N]; signed main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) f[i][1]=i+1; for(int j=1;j<=m;j++) f[1][j]=j+1; for(int i=2;i<=n;i++) { for(int j=2;j<=m;j++) { f[i][j]=(j*f[i-1][j-1]+f[i-1][j])%mod; } } cout<<f[n][m]<<endl; return 0; }
C 解法, 执行用时: 12ms, 内存消耗: 8200K, 提交时间: 2022-05-08 20:50:58
#include<stdio.h> #define mod 998244353 int main(void) { int n,m; int i,j; long long dp[1005][1005]; scanf("%d %d",&n,&m); for(i=1;i<=m;i++) dp[1][i]=i+1; for(j=1;j<=n;j++) dp[j][1]=j+1; for(i=2;i<=n;i++) { for(j=2;j<=m;j++) { dp[i][j]=(dp[i-1][j-1]*j%mod+dp[i-1][j])%mod; } } printf("%lld",dp[n][m]); return 0; }
C++ 解法, 执行用时: 14ms, 内存消耗: 8224K, 提交时间: 2022-03-30 15:24:21
#include <bits/stdc++.h> using namespace std; const int Mod=998244353,MAX=1e3+5; long long n,m,dp[MAX][MAX]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) dp[i][1]=i+1; for(int i=1;i<=m;i++) dp[1][i]=i+1; for(int i=2;i<=n;i++) for(int j=2;j<=m;j++) dp[i][j]=(j*dp[i-1][j-1]%Mod+dp[i-1][j])%Mod; cout<<dp[n][m]; return 0; }