提供一种满足的构造方法,每一行每一列的公差(d)都是相等的 第i行的和=(i−1)∗m∗d+m∗(2∗a1∗(m−1)∗d)/2 等式第二项是定值,第i行于第i+1行的差也是定值为m∗d.得到n∗m∗(2∗a1+(m−1)∗d)/2=x,题目要求正整数得到一下两个性质 1. x∗2是n∗m的倍数 2. 2∗a1+(m−1)∗d=(x∗2/n/m)可以解得a1和d是正整数 最简单的方法也就是枚举d=0,1,2. 2∗a1一定是偶数,所以d=0,1,2可以概括全部情况 也可以直接exgcd求解一个二元一次方程 整体复杂度o(1)
#include <bits/stdc++.h>//分讨
using namespace std;
#define int long long
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, x1;
cin >> n >> m >> x1;
if((n<=2&&m<=2)&&n*m<=x1){
for(int i=1;i<=n;i++){
if(i<n)
for(int j=1;j<=m;j++){
cout<<1<<' ';
}
else{
for(int j=1;j<m;j++){
cout<<1<<' ';
}
cout<<x1-n*m+1<<' ';
}
cout<<'\n';
}
return 0;
}
if (x1 * 2 % (n * m) != 0) {
cout << -1 << '\n';
return 0;
}
x1 *= 2;
x1 /= n;
x1 /= m;
int a1, dd, boo = 0;
if (x1 - (n - 1) >= 2 && (x1 - (n - 1)) % 2 == 0) {
dd = 1;
a1 = (x1 - (n - 1)) / 2;
boo = 1;
} else if (x1 - 2 * (n - 1) >= 2 && (x1 - 2 * (n - 1)) % 2 == 0) {
dd = 2;
a1 = (x1 - 2 * (n - 1)) / 2;
boo = 1;
} else if (x1 >= 2 && (x1) % 2 == 0) {
dd = 0;
a1 = x1 / 2;
boo = 1;
}
if (boo == 1) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cout << a1 << ' ';
cout << '\n';
a1 += dd;
}
} else {
cout << "-1" << '\n';
}
}
小明希望你构造一个n行m列的、由正整数组成矩阵,满足每一行、每一列均为等差数列,且所有元素之和恰好等于x。你能帮帮他吗?
输入三个正整数n,m,x,代表矩阵的行数、列数和所有元素之和。
1≤n,m≤500
1≤x≤1018
如果无解,请输出−1
否则输出n行,每行输出m个整数aij,代表小明构造的矩阵。
输入
2 3 15
输出
1 2 3
2 3 4