原题链接 位于CodeForceshttps://codeforces.com/problemset/problem/675/B
翻译
小 V 在玩填数游戏,游戏在 3×3 的正方形中进行。
- 9 个格子中的数字都为 1∼n 的整数,不同格子中的数字可以相同。
- 正方形可以划分出 4 个 2×2 的小正方形,这四个正方形中的数之和相同。
- 如图所示,a, b, c, d 的值是已知的。
现在 小 V 想知道,剩下的 5 个数一共有多少种填法。
题意及思路
可以很容易得到,四周数字的填写与中间数字无关,因而我们枚举中间数 e 为1~n
所以可以知道每次枚举e时,a,b,c,d,e是固定值,因而四周数的相对差是相同的
所以根据n的大小得出四周数的范围,因为四个方块的和相同,则与:a+b, a+c, b+d, c+d有关
经过分析,四周数的范围与其中的 最大值max 与 最小值min 有关
范围大小是最大和减最小和加一,可以得出每次枚举的四周数范围为n-(max-min+1)+1
因为我们知道当差值过大以至于大于n时没有答案,所以每次枚举结果为max(n-(max-min+1)+1, 0)
因为枚举中间数, 所以次数即为n,答案为 n * max(n-(max-min+1)+1, 0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i, j, t;
int a, b, c, d;
long long n;
scanf("%lld%d%d%d%d", &n, &a, &b, &c, &d);
int xmax = max(max(a+b, a+c),max(b+d, c+d));
int xmin = min(min(a+b, a+c),min(b+d, c+d));
printf ("%lld", n * max<long long>(n - (xmax - xmin + 1) + 1, 0));
// 此处需用“longlong的max”,因为答案包含longlong数
return 0;
}