要求:1<=a,b,c,d<=n (1<n<1e5)
a+b-c-d=k (-(2n-1)<=k<=(2n-1))
->a+b-k=c+d;
将a+b,c+d看作整体。
A-k=B
则B属于2-2*n;
所以从1-1e5(最大)遍历A,只要A-k符合B的合法分为就将这个数记录下来。
遍历完一遍以后处理所有统计的数字。
要求,a,b,c,d都要大于等于1,小于等于n。
遍历统计的数:
a,b的取值,如果A<=n+1,则其中一点值可以从1取到A-1,对应A-1种分配方法,如果A>n+1,则一点要从A-n点开始取,对应有n-(A-n)+1种取法。
c,d的取值与a,b取法相同。
之后将统计的A中(a,b)的取值种数与B中(c,d)的取值种数相乘加到变量ans上。
遍历后得到最后的结果ans。
#include <stdio.h>
int a[1000001];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
#endif
int i, j, n, k, num = 0;
long long int ans = 0, u, v;
scanf("%d %d", &n, &k);
for (i = 1; i <= 2 * n; i++)
{
if (i - k <= 2 * n && i - k >= 2)
{
//printf("%d %d\n",i,i-k);
a[num] = i;
num++;
}
}
for (i = 0; i < num; i++)
{
if (a[i] <= n + 1)
{
u = a[i] - 1;
}
else
{
u = n - (a[i] - n) + 1;
}
if(a[i]-k<=n+1)
{
v=a[i]-k-1;
}
else
{
v = n - (a[i]-k - n) + 1;
}
//printf("%lld %lld\n",u,v);
ans += u * v;
}
printf("%lld\n", ans);
return 0;
}