列表

详情


NC15500. 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python(2.7.3) 解法, 执行用时: 237ms, 内存消耗: 32108K, 提交时间: 2018-04-06 19:37:01

mod = 998244353
p = int(raw_input())

def fac(n, mod):
    ret = 1
    for i in range(2, n + 1):
        ret = ret * i % mod
    return ret

print fac(p, mod) * fac(p, mod) * 2 % mod

C++14(g++5.4) 解法, 执行用时: 9ms, 内存消耗: 408K, 提交时间: 2020-07-11 20:59:07

#include<cstdio>
int main()
{
    long long ans=2,n;
    scanf("%lld",&n);
    for(int i=2;i<=n;i++)
    ans*=i,ans%=998244353,ans*=i,ans%=998244353;
    printf("%lld\n",ans);
}

Python3(3.5.2) 解法, 执行用时: 209ms, 内存消耗: 3560K, 提交时间: 2018-04-06 19:33:32

mod = 998244353


def pp(n):
    ret = 1
    for i in range(n):
        ret *= i + 1
        ret %= mod
    return ret

n = int(input())
ans = pp(n) ** 2 * 2 % mod
print(ans)

C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 496K, 提交时间: 2020-02-29 15:04:14

#include<cstdio>
int main()
{
	long long ans=2,n;
	scanf("%lld",&n);
	for(int i=2;i<=n;i++)
	ans*=i,ans%=998244353,ans*=i,ans%=998244353;
	printf("%lld\n",ans);
}

上一题