观察矩阵可以发现如下规律:
第一行:1, 1+2, 1+2+3, ..., n(n+1)/2
第二行:2, 2+3, 2+3+4, ..., n(n+1)/2
第k行: k(k-1)/2, k(k-1)/2+ (k+1), ...
因此我们可以先计算每一行的第一位数,后面的数可以根据第一位数得到,减少了计算量,代码如下:

#include<iostream>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        int pre=0;
        for(int i=0;i<n;++i){
            pre = i*(i+1)/2+1; // 每行首位
            cout<<pre<<" ";
            for(int j=i+2;j<=n;++j){
                pre += j;
                cout<<pre<<" ";
            }
            cout<<endl;
        }
    }

    return 0;
}