Wannafly挑战赛13 C:zzf的好矩阵(思维)

题目描述

一个8 * 8的棋盘,第一个格子放1个麦穗,第二个格子放2个麦穗,第三个格子放4个麦穗……那么最后,共要放几个麦穗呢?

zzf表示这个问题实在太简单,于是重新规定了游戏的规则。

初始的棋盘为空,棋盘大小为p*p,然后他要对棋盘进行若干次操作,可以被选择的操作如下:

1、选择一行,每个格子再放一个麦穗

2、选择一列,每个格子再放一个麦穗

进行若干次操作后,如果得到的棋盘满足如下性质

1、每个格子都有至少一个麦穗

2、每个格子最多只能有p*p个麦穗

3、任意两个格子的麦穗数不同

如果满足以上三条,那么称这个棋盘是一个好棋盘,若只是构造一个好棋盘那就太没意思了,zzf想知道他能得到多少个不同的好矩阵

定义不同的矩阵即只要存在一个位置不同即是不同的

答案对998244353取模

输入描述:
第一行读入一个数p,表示这个棋盘的大小
输出描述:
输出一行包括一个数,表示好棋盘的个数
示例1
输入
2
输出
8
说明
样例解释 :
1 2
3 4
3 4
1 2
1 3
2 4
2 4
1 3
2 1
4 3
4 3
2 1
3 1
4 2
4 2
3 1
备注:
2 <= p <= 1e6, 保证p是质数
题意
如上
题解
首先自己写一个3*3的棋盘
1,2,3
4,5,6
7,8,9
可以发现行和行可以交换,列和列可以交换,易想到行和列全排列p!*p!
然后,通过观察样例发现,棋盘可以横过来
1,4,7
2,5,8
3,6,9
这样又是p!*p!
综上所述,答案就是2*p!*p!(题解的推理太神了,蒻鸡根本看不懂)
代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long int
 4 const ll mod=998244353,N=1e6+5;
 5 int main()
 6 {
 7     ll p,jc[N];
 8     jc[1]=1;
 9     for(int i=2;i<N;i++)
10         jc[i]=jc[i-1]*i%mod;
11     cin>>p;
12     cout<<2*jc[p]*jc[p]%mod;
13     return 0;
14 }
原文地址:https://www.cnblogs.com/taozi1115402474/p/8745824.html