题意:数组a通过交换一对数字,得到了b数组,给出x=和y=
和b数组,问有多少对l,r(l<=r)能满足条件
题解:可以推出两个式子:
设y-Y为s1,x-X为s2。
当s1=0,s2=0则
当s1!=0&&s2!=0&&s2%s1==0: 套公式在去j的时候判断是否超过范围。
其他条件都是无答案。
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
#define ll long long
using namespace std;
ll X,Y,n,x,y,sum;
ll a[200010];
vector<int>v[200010];
int main(){
int T;
scanf("%d",&T);
while(T--){
for(int i = 0 ; i <= 100000 ; i++){
v[i].clear();
}
scanf("%lld %lld %lld",&n,&x,&y);
X=0,Y=0,sum=0;
for(int i = 1 ; i <= n ;i++){
scanf("%lld",&a[i]);
X+=a[i]*i;
Y+=a[i]*a[i]*i;
}
ll needy = y - Y;
ll needx = x - X;
if(needy==0&&needx==0){
for(int i = 1 ; i <= n ; i++){
sum += v[a[i]].size();
v[a[i]].push_back(i);
}
}else if(needx==0){
sum = 0;
}else if(needy%needx==0){
ll need = needy/needx;
for(int i = 1 ; i <= n ; i++){
if(need-2*a[i]&&need-a[i]>=1&&need-a[i]<=100000){
int j = i - needx/(need-2*a[i]);
int len = v[need-a[i]].size();
int it = lower_bound(v[need-a[i]].begin(),v[need-a[i]].end(),j)-v[need-a[i]].begin();
if(it<len&&v[need-a[i]][it]==j){
sum++;
}
}
v[a[i]].push_back(i);
}
}
cout<<sum<<endl;
}
// printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
}