题解:P10416 [蓝桥杯 2023 国 A] XYZ

· · 题解

一道大水题。

首先考虑无解。阅读题面,首先我们可以发现,x 与 y 的最小值是 l,也就是说 z 的最小值为 2l。因此当 r 小于 2l 时,答案为 0。

进一步观察,我们可以发现对于任意一个不小于 2l 不大于 r 的可能的和 z,我们都能从 l 到 z-l 为其匹配两个加数。就样例来说,当和为 2,有 1+1 一种可能。当和为 3,有 1+2 和 2+1 两种可能。当和为 4,有 1+3 和 2+2 和 3+1 三种可能。再明显一点,当和为 2l 时,方案数为 1,当和为 2l+1 时,方案数为 2,当和为 2l+2 时,方案数为 3。于是答案为 1+2+3。

这是啥?等差数列求和啊!首项为 1,末项为 r-2l+1,项数为 r-2l+1,那么答案显而易见:

(r-2*l+1)*(r-2*l+2)/2

附上代码:

#include<bits/stdc++.h>
#define int long long
#define il inline
#define pii pair<int,int>
#define mk make_pair
#define mod 20123
using namespace std;
il int rd(){
    int jya=0,tl=1;char jyt=getchar();
    while(!isdigit(jyt)){if(jyt=='-')tl=-1;jyt=getchar();}
    while(isdigit(jyt)){jya=jya*10+(jyt-'0');jyt=getchar();}
    return jya*tl;
}
il void wr(int jjy){
    if(jjy<0)putchar('-'),jjy=-jjy;
    if(jjy>9)wr(jjy/10);
    putchar(jjy%10+48);
}
il int max(int x,int y){return x>=y?x:y;}
il int min(int x,int y){return x<=y?x:y;}
const int JYAAKIOI=1145141919810;
int T,l,r;
signed main(){
    //freopen("jytwcnm.in","r",stdin);
    //freopen("jytwcnm.out","w",stdout);
    T=rd();
    while(T--){
        l=rd();r=rd();
        if(r<2*l)putchar('0');
        else wr((r-2*l+1)*(r-2*l+2)/2);
        putchar('\n');
    }
    return 0;
}