2019计蒜之道 第四场 A 矩阵计数

Description:

腾讯游戏开发了一款全新的编程类益智小游戏,榜首的题目是一道关于矩阵的计算,你用多久能计算出来呢?

游戏中给出一个 N×M 的矩阵,若其中填入的内容是数字1∼N×M 的排列,求问有多少种不等价的矩阵?

等价矩阵:若一个矩阵 A 可以通过交换其中两行或者两列变成另一个矩阵 BB,则称 A 和 B 等价。且若 A 和 B等价,B 和 C 等价,则 A 和 C 也等价。

答案对 998244353 取模。

输入格式

一行两个正整数 N 和 M,空格隔开。

输出格式

一个正整数,表示答案对 998244353 取模的结果。

数据规模

N,M≤2000

样例输入1

1 2

样例输出1

1

样例输入2

2 2

样例输出2

6

样例输入3

3 3

样例输出3

10080

题意:

每一种本质不同的情况,都对应着N!M!种形态,因为行之间有N!种换法,列之间有M!种换法,所以答案是

(NM)!/(N!M!)

阶乘数据太大,为了防止溢出整体取模改成分步取模

AC代码:

#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define a 998244353
using namespace std;
ll n,m;
int i,j,k,l;
ll jc(int x)
{
    ll sum=1;
    for(i=2;i<=x;i++)
    {
        sum*=i;
    }
     return sum;
}
int main()
{
   scanf("%d %d",&n,&m);

       ll ans=n*m;
       ans=jc(ans);
       ll nn=jc(n);
       ll mm=jc(m);
       ll c=((ans%a)/((nn%a)*(mm%a))%a)%a;
       printf("%d\n",c);
    return 0;
}



 

 

你可能感兴趣的:(笔记)