1 条题解
-
0
自动搬运
来自洛谷,原作者为

Wenoide
Wrong answer on line 1 column 12.搬运于
2025-08-24 22:21:21,当前版本为作者最后更新于2020-05-03 12:31:30,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
-
当 时,输出 即可。
-
当 时,显然无解。
-
当 时:
按照题目要求,我们可以构造一个矩阵,使得:
- 每行的平均数均为该行的倒数第二个数。
- 每列的平均数均为该列的倒数第二个数。
为了填入的数尽可能小,不妨令第一行的前 个数为 。
若要使第一行的平均数为其倒数第二个数,则第一行的最后一个数为 。
将第一行的每个数加上 ,即可得到第二行。
不难证明,第二行的平均数也是其倒数第二个数。
类似地,可以得到矩阵的前 行。
若要使第一列的平均数为其倒数第二个数,则第一列的最后一个数为。
类似地,可以得到最后一行的后 个数。
不难证明,最后一行的平均数也是其倒数第二个数。
最终的矩阵如下:
这个矩阵中是否存在相同的数?
在 时恒成立。那么,每行的 个数都是递增的。
不难发现,第 行的第一个数均大于上一行的最后一个数。
$1+\frac{(n-2)(n-1)n(n+1)}{4}>\frac{(n-1)n}{2}+(n-2)\times\frac{(n-1)n}{2}$ 在 时恒成立。那么,第 行的第一个数也大于上一行的最后一个数。
所以,矩阵中不存在相同的数。
当 取最大值 时,矩阵中的最大数 $\frac{(n-1)n}{2}+\frac{(n-2)(n-1)n(n+1)}{4}=24502500\le 10^9$。也满足要求。
参考代码:
#include<cstdio> int main(){ int n; scanf("%d",&n); if(n==1){ puts("1"); return 0; } if(n==2){ puts("-1"); return 0; } int k1=(n-1)*n/2,k2=(n-2)*(n-1)*n*(n+1)/4; for(int i=1;i<n;++i){ for(int j=1;j<n;++j){ printf("%d ",j+(i-1)*k1); } printf("%d\n",i*k1); } for(int j=1;j<n;++j){ printf("%d ",j+k2); } printf("%d\n",k1+k2); return 0; } -
- 1
信息
- ID
- 5524
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者