列表

详情


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;
}

上一题