点击这里查看原题
此题太过丧心病狂,建议看这里
另外这题要学会卡时,一定要加inline才勉强在20.7s内跑过
#include<bits/stdc++.h>
#define ll long long
#define inf 99999999
using namespace std;
const int M=1005,N=1e6+5;
int n,m,a[M<<1],b[M<<1],cnt,pr[N/10],fac[N][3],g[M][M];
bool np[N];
inline void order(int x){
if(fac[x][0]>fac[x][1]) swap(fac[x][0],fac[x][1]);
if(fac[x][1]>fac[x][2]) swap(fac[x][1],fac[x][2]);
}
inline void pre1(){
for(int k=0;k<3;k++) fac[1][k]=1;
int n=1e6;
for(int i=2;i<=n;i++){
if(!np[i]){
pr[++cnt]=i;
fac[i][0]=fac[i][1]=1;
fac[i][2]=i;
}
for(int j=1;j<=cnt&&i*pr[j]<=n;j++){
np[i*pr[j]]=1;
fac[i*pr[j]][0]=fac[i][0]*pr[j];
fac[i*pr[j]][1]=fac[i][1];
fac[i*pr[j]][2]=fac[i][2];
order(i*pr[j]);
if(i%pr[j]==0) break;
}
}
}
inline void pre2(){
memset(np,0,sizeof(np));
cnt=0;
int n=1000;
for(int i=1;i<=n;i++) g[i][1]=1;
for(int i=0;i<=n;i++) g[i][0]=g[0][i]=i;
for(int i=2;i<=n;i++){
if(!np[i]){
pr[++cnt]=i;
for(int j=1;j<=n;j++) g[j][i]=j%i==0?i:1;
}
for(int j=1;j<=cnt&&i*pr[j]<=n;j++){
np[i*pr[j]]=1;
if(i%pr[j]==0){
for(int k=1;k<=n;k++){
if((k/g[k][i])%pr[j]==0) g[k][i*pr[j]]=g[k][i]*pr[j];
else g[k][i*pr[j]]=g[k][i];
}
break;
}
for(int k=1;k<=n;k++) g[k][i*pr[j]]=g[k][i]*g[k][pr[j]];
}
}
}
inline int gcd(int a,int b){
if(a==0) swap(a,b);
if(b==0) return a;
if(a<=1000) return g[a][b%a];
int res=1;
for(int i=0;i<3;i++){
int c=fac[a][i],d;
if(c<=1000) d=g[c][b%c];
else if(b%c==0) d=c;
else d=1;
res*=d;
b/=d;
}
return res;
}
int main(){
pre1();
pre2();
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<m;i++) scanf("%d",&b[i]);
unsigned int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) ans+=gcd(a[i],b[j])^i^j;
printf("%u\n",ans);
}
return 0;
}