A Easy Equation
题目
You are given four positive integers 𝑥, 𝑦, 𝑧, 𝑘, please help little M calculate the number of equations 𝑥 + 𝑦 + 𝑧 = 𝑘 when 0 ≤ 𝑥 ≤ 𝑎, 0 ≤ 𝑦 ≤ 𝑏, 0 ≤ 𝑧 ≤ 𝑐, 0 ≤ 𝑘 ≤ 𝑑
输入描述:
Four integers 𝑎, 𝑏, 𝑐, 𝑑 (0 ≤ 𝑎, 𝑏, 𝑐, 𝑑 ≤106)
输出描述:
One integer the number of equations.
It is guaranteed that all the answers fit 64-bit integer.
样例1
输入:
3 3 3 3
输出:
20
样例2
输入:
300 300 300 300
输出:
4590551
样例3
输入:
12345 12345 12345 12345
输出:
313713415596
样例4
输入:
0 0 0 0
输出:
1
C++代码
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const int N = 1e7;
ll s1[N],s2[N];//两层差分数组
ll ans = 0;
void insert1(int l, int r,int c)
{
s1[l] += c;
s1[r + 1] -= c;
}
void insert2(int l, int r,int c)
{
s2[l] += c;
s2[r + 1] -= c;
}
int main()
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
int a,b,c,d;
cin >> a >> b >> c >> d;
//第一层差分数组,代表x+y的差分情况
for(int i = 0; i <= a; i ++)
insert1(i,i + b,1);
for(int i = 0; i <= a + b; i ++)
s1[i] += s1[i - 1]; //还原数组s1
//第二层差分数组,代表(x+y)+ z 的差分情况
for(int i = 0; i <= a + b; i ++)
insert2(i, i + c,s1[i]);
for(int i = 0; i <= a + b + c; i ++)
s2[i] += s2[i - 1];//还原数组s2
//数组下标对应的是求和的值,下标对应的值是当前该值的次数
for(int i = 0; i <= d; i ++)
ans += s2[i];
cout << ans << endl;
return 0;
}