1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<bits/stdc++.h> #define int long long using namespace std; const int max_n=300005,mod=1000000009; inline int read(){ int x=0;bool w=0;char c=getchar(); while(c<'0' || c>'9') w|=c=='-',c=getchar(); while(c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return w?-x:x; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10^48); } inline int mi(int a,int p=mod-2){ int res=1; while(p){ if(p&1) res=res*a%mod; a=a*a%mod,p>>=1; } return res; } struct Matrix{ int f[2][2]; Matrix(int A=0,int B=0,int C=0,int D=0){ f[0][0]=A,f[0][1]=B,f[1][0]=C,f[1][1]=D; } Matrix operator * (Matrix &b){ Matrix a=*this; return Matrix((a.f[0][0]*b.f[0][0]+a.f[0][1]*b.f[1][0])%mod,(a.f[0][0]*b.f[0][1]+a.f[0][1]*b.f[1][1])%mod,(a.f[1][0]*b.f[0][0]+a.f[1][1]*b.f[1][0])%mod,(a.f[1][0]*b.f[0][1]+a.f[1][1]*b.f[1][1])%mod); } bool operator < (const Matrix &b) const{ Matrix a=*this; if(a.f[0][0]^b.f[0][0]) return a.f[0][0]<b.f[0][0]; if(a.f[0][1]^b.f[0][1]) return a.f[0][1]<b.f[0][1]; if(a.f[1][0]^b.f[1][0]) return a.f[1][0]<b.f[1][0]; if(a.f[1][1]^b.f[1][1]) return a.f[1][1]<b.f[1][1]; return 0; } bool operator == (const Matrix &b) const{ Matrix a=*this; return (a.f[0][0]==b.f[0][0] && a.f[0][1]==b.f[0][1] && a.f[1][0]==b.f[1][0] && a.f[1][1]==b.f[1][1]); } }f[2][max_n],S; const Matrix Ep(1,0,0,1); inline Matrix Inv(Matrix a){ int x=mi((a.f[0][0]*a.f[1][1]-a.f[1][0]*a.f[0][1]%mod+mod)%mod); return Matrix(a.f[1][1]*x%mod,mod-a.f[0][1]*x%mod,mod-a.f[1][0]*x%mod,a.f[0][0]*x%mod); }
map<Matrix,int> mp;
int n,cnt[max_n],ans; const int N=300000;
signed main(){ srand(time(0)); for(int i=1;i<=N;++i){ f[1][i]=Matrix(rand()%mod,rand()%mod,rand()%mod,rand()%mod); f[0][i]=Inv(f[1][i]); } for(int T=read();T;--T){ n=read(); S=Ep,ans=0; mp.clear(),++mp[Ep]; for(int i=1;i<=n;++i){ int x=read(); ++cnt[x]; S=S*f[cnt[x]&1][x]; ans+=mp[S]++; } write(ans),putchar('\n'); memset(cnt,0,sizeof(int)*(n+1)); } return 0; }
|