求出b數組的x,y值,再與原x、y相減得
dx=(i*b[i]+j*b[j])-(i*b[j]+j*b[i])=(i-j)*(b[i]-b[j])
同理 dy=(i-j)*(b[i]^2-b[j]^2)=dx*(b[i]+b[j])
所以直接枚舉i 將求出的 b[j]=dy/dx-b[i] 帶入上面第一個式子求出 j,判斷 b[j]和求出的是否一致。
同時特判下dx,dy爲0時的情況即可。。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
long long B[100010];
int cnt[100010];
int main(){
int t,i,n;
scanf("%d",&t);
long long x,y,a,b,k,u;
while(t--){
scanf("%d%lld%lld",&n,&x,&y);
a=b=0;
memset(cnt,0,sizeof(cnt));
for(i=1;i<=n;i++){
scanf("%lld",&B[i]);
a+=i*B[i];
b+=i*B[i]*B[i];
}
x=a-x;
y=b-y;
long long ans=0;
if(x==0){
if(y==0){
for(i=1;i<=n;i++){
ans+=cnt[B[i]];
cnt[B[i]]++;
}
}
}
else{
if(y%x==0){
y/=x;
for(i=1;i<=n;i++){
k=B[i]-(y-B[i]);
if(k&&x%k==0){
u=i-x/k;
if(u>=1&&u<i&&B[u]==y-B[i]) ans++;
}
}
}
}
printf("%lld\n",ans);
}
return 0;
}