Wannafly挑戰賽13 C-zzf的好矩陣
鏈接:https://www.nowcoder.com/acm/contest/80/C
來源:牛客網
題目描述
一個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是質數
思路
看題幹,“1、每個格子都有至少一個麥穗;2、每個格子最多只能有p*p個麥穗;3、任意兩個格子的麥穗數不同”。
其實相當於棋盤最終要放的麥穗是一定的(只能是1~p^2)。然後考慮 此矩陣行和列的(全排列p! 和 全排列p!),最後由於是該矩陣是方陣(可逆*2)。
顯然答案爲 2*ans*ans%Mod。
備註中的“保證p是質數”暫時沒想明白有啥搞頭。只粗暴理解爲 p不爲0或1。
AC代碼
#include <iostream>
typedef long long ll;
using namespace std;
const int Mod = 998244353;
int main() {
int p;
cin >> p;
ll ans=1;
// ans=n!
for(int i=1; i<=p; i++) {
ans=ans*i%Mod;
}
// if(p==1) {
// cout << 1 << endl;
// } else {
cout << 2*ans*ans%Mod << endl;
// }
return 0;
}