题意
思路
正难则反
反过来需要考虑的是:
(1) 所有满条件一的(x,y)有多少对:
x = 0 时,有c+1对 x = 1 时,有c对 ...... x = c 时,有1对
以此类推 一共有 (c+2)(c+1)/2 对
(2) 符合 x + y ∈ S的有多少对:
那就是x + y = ai 对 x = 0 而言 y有固定的一种取值ai
但是要保证的是 y <= c 所以有 c - x + 1
而x: 0->ai 所以对每一个ai有 ai/2 + 1种
(3) 符合 y - x ∈ S 的有多少对:
y - x = ai
那么 y = ai + x < c
y ∈ [x,c-a[i]] 而x是从0开始的 所以每一个ai 都有 c - a[i] + 1 种的情况
(4) 符合 (2) + (3)的有多少对:
x + y = ai
y - x = aj
y = (ai + aj) / 2 所以要保证的是只有同奇偶性 才有这种情况
比如 奇数有{1,3,5}那么其实是C(2,3) + 3 那就是 n(n-1)/2 + n = n(n+1)/2
答案就是 odd(odd+1) / 2 + even(even+1) / 2
(LAST ) ALL IN ALL
根据容斥定理 res = (1) - (2) - (3) + (4)
cpp
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
#include<vector>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int INF = 1e18 + 10;
const int N = 1e5 + 10;
const int M = 1e7 + 10;// 节点数量 3e6就够了是为什么?
const int mod = 1e9 + 7;
int n, m, k, x, now, ans;
int qcal(int a, int b) { int res = 1; while (b) { if (b & 1) res = res * a % mod; b >>= 1; a = a * a % mod; } return res; }
int a[N], b[N];
bool is_prime(int n){if (n < 2) return false; for (int i = 2; i <= n / i; i++){if (n % i == 0){return false;}}return true;}
void gzy()
{
int c;
cin >> n >> c;
int ans = (1 + c) * (2 + c) / 2;
int odd = 0,even = 0;
for(int i = 1;i <= n;i ++)
{
cin >> x;
ans -= x / 2 + 1;
ans -= (c - x + 1);
if(x % 2 == 0) odd ++;
else even ++;
}
ans += (odd + 1) * odd / 2;
ans += (even + 1) * even / 2;
cout << ans << endl;
}
signed main()
{
int _ = 1; cin >> _;
while (_--) gzy();
return 0;
}
// /**
// * ┏┓ ┏┓+ +
// * ┏┛┻━━━┛┻┓ + +
// * ┃ ┃
// * ┃ ━ ┃ ++ + + +
// * ████━████+
// * ◥██◤ ◥██◤ +
// * ┃ ┻ ┃
// * ┃ ┃ + +
// * ┗━┓ ┏━┛
// * ┃ ┃ + + + +Code is far away from
// * ┃ ┃ + bug with the animal protecting
// * ┃ ┗━━━┓ 神兽保佑,代码无bug
// * ┃ ┣┓
// * ┃ ┏┛
// * ┗┓┓┏━┳┓┏┛ + + + +
// * ┃┫┫ ┃┫┫
// * ┗┻┛ ┗┻┛+ + + +
// */