思路

  • 暴力搜索加剪枝
  • 搜索过程中行或者列的和大于sum剪掉
  • 搜索到(x,y),假设剩下的都取最大值sum,能否满足要求,如果不能剪掉
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int N = 1e3 + 10, M = N * 2;
const int INF = 0x3f3f3f3f3f3f3f3f;
int a[N][N];
int srow[N], scol[N];
int res, n, sum, cnt;
void dfs(int x, int y)
{
    if(y == n)
    {
        x ++;
        y = 0;
    }
    if(x == n)
    {
        //cout << cnt << endl;
        int ff = 0;
        for(int i = 0; i < n; i ++)
        {
            //cout << srow[i] << ' ';
            if(srow[i] != sum || scol[i] != sum)
            {
                ff = 1;
                 break;
            }
        }
        //cout << endl;
        if(ff == 0) res ++;
        return ;
    }
    for(int i = 0; i <= sum; i ++)
    {
        a[x][y] = i;
        if(srow[x] + i > sum || scol[y] + i > sum) continue ;
        if(srow[x] + i + (n - y - 1) * sum < sum || scol[y] + i + (n - x - 1) * sum < sum) continue;
        srow[x] += i;
        scol[y] += i;
        dfs(x, y + 1);
        srow[x] -= i;
        scol[y] -= i;
    }
}
signed main()
{
    cin >> sum >> n;
    dfs(0, 0);
    cout << res << endl;
    //cout << cnt << endl;
    //cout << (int)pow(8, 9) << endl;
    return 0;
}