题意:在给定序列中找任意长度的连续子序列,使得子序列所有数的乘积等于p2-q2。问有多少个这样的子序列。
题记:任意整数的平方差是满足2k+1或者4k。
奇数乘奇数=奇数,奇数乘偶数=偶数,偶数乘偶数=4*k
首先算出程度为n的序列的总子序列长度,然后遍历数组,当遇到一个偶数且不是4的倍数时,当这个数和奇数相乘时会得到偶数,而且这个偶数是一定不是4的倍数,所以从这个数的下标向左向右延伸,直到找到一个偶数。把总子序列数量减去()左边个数+1)*(右边个数+1)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=1e5+10;
int a[N];
int check(int x){
if(x%2==0){
if(x%4==0)
return 4;
else
return 2;
}
else
return 0;
}
int main(){
int T;
cin>>T;
while(T--){
ll n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
ll ans=(n*(n+1))/2;//子序列的总数量
for(int i=0;i<n;i++){
if(check(a[i])==2){
ll num1=0,num2=0;
for(int j=i-1;j>=0;j--){
if(check(a[j])==0)
num1++;
else
break;
}
for(int j=i+1;j<n;j++){
if(check(a[j])==0)
num2++;
else
break;
}
ans-=(num1+1)*(num2+1);
}
}
cout<<ans<<endl;
}
return 0;
}