题意:
解法:
a+b−c−d=k(a+b)−(c+d)=k(a+b)=k+(c+d)设f(i)为a+b=i的方案数,那么式子可以变为:f(i+k)=k+f(i)f(i)可以利用差分预处理枚举i,答案累加f(i)∗f(i+k).a+b-c-d=k\\ (a+b)-(c+d)=k\\ (a+b)=k+(c+d)\\ 设f(i)为a+b=i的方案数,那么式子可以变为:\\ f(i+k)=k+f(i)\\ f(i)可以利用差分预处理\\ 枚举i,答案累加f(i)*f(i+k). a+b−c−d=k(a+b)−(c+d)=k(a+b)=k+(c+d)设f(i)为a+b=i的方案数,那么式子可以变为:f(i+k)=k+f(i)f(i)可以利用差分预处理枚举i,答案累加f(i)∗f(i+k).
code:
#include<bits/stdc++.h>
#define int long long
//#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
const int mod=998244353;
int f[maxm];
int n,k;
void solve(){
cin>>n>>k;
//f[i]为a+b=i的方案数,差分可以O(n)预处理
for(int i=1;i<=n;i++){//枚举a,b的取值为[1,n]
f[i+1]++;
f[i+n+1]--;
}
for(int i=1;i<maxm;i++){
f[i]+=f[i-1];
}
//
int ans=0;
for(int i=1;i<maxm;i++){
if(k+i>=0&&k+i<maxm){
ans+=f[i]*f[k+i];
}
}
cout<<ans<<endl;
}
signed main(){
solve();
return 0;
}