Wannafly挑战赛13 C-zzf的好矩阵

本文介绍了Wannafly挑战赛中关于zzf的好矩阵问题,探讨了一个p*p的棋盘经过特定操作后形成满足特定条件的好棋盘的计数方法。关键在于理解棋盘上的麦穗数量限制,并通过全排列计算不同好矩阵的数量,最后求得答案对998244353取模的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值