萌萌构造题,随便构造构造就做出来了。似乎跟官方题解思路一样。
首先解决以下问题:给定一个质数 P,构造一个每个数在 0∼P−1 的大小为 P2×P2 的矩阵,满足不存在 x1≠x2,y1≠y2 使得 ax1,y1=ax1,y2=ax2,y1=ax2,y2。
类似 9×9 的数独那样,我们将所求矩阵划分为 P2 个大小为 P×P 的宫。如果一个宫 M 满足 Mi,j=(i+j+k)modP,就称其为 k 类宫,记作 Bk。
例如,P=3 时:
B0=⎡⎢⎣012120201⎤⎥⎦,B1=⎡⎢⎣120201012⎤⎥⎦,B2=⎡⎢⎣201012120⎤⎥⎦
对于所求矩阵的第 i 行第 j 列的宫,令其为 BijmodP 即可。
例如,P=3 时:
A=⎡⎢⎣B0B0B0B0B1B2B0B2B1⎤⎥⎦=⎡⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢⎣012012012120120120201201201012120201120201012201012120012201120120012201201120012⎤⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥⎦
证明采用反证法:假设存在相等的四个数位于两行、两列的交点,显然必须在四个不同的宫,设左上、右上、左下、右下对应的宫分别是 a,b,c,d 类宫,则有 a−b=c−d,但是这不可能发生。
解决了上面的问题,原问题便迎刃而解了。
代码:
const int P = 23;
cin >> n >> m;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
int val = ((i / P) * (j / P) + i + j) % P + 1;
cout << val << " \n"[j == m - 1];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现