C
不同组相应位置对于某个数同余,求
。
则找出相应位置中任取一个数,做减法加绝对值,此时余数被抵消,剩下为的倍数。则对剩下的数取
,即得
。为方便这里取第一组中的数。然后判断按相应位置划分后,所的
求一个总的
,若不为1,则说明存在一个
使所有相应位置数满足同余。
若只有一个数,即分为一组,没有相应位置数,则直接输出1
若有两个数,则为减后所得的数自身
import java.util.Arrays;
import java.util.Scanner;
class Tx1{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int T=input.nextInt();
while(true) {
if(T==0) break;
int n=input.nextInt();
int[] a=new int[n+1];
for(int i=1;i<=n;++i)a[i]=input.nextInt();
int[] qi=new int[n+1];
int t=0;
for(int i=2;i<=Math.sqrt(n);++i) {
if(n%i==0) {
int x=n/i;
if(x==i) {
t++;qi[t]=i;
}else {
t++;
qi[t]=i;
t++;
qi[t]=x;
}
}
}
int ans=1;
if(n==1) {
System.out.println(ans);
T--;
continue;
}
qi[0]=1;
for(int i=0;i<=t;++i) {
int k=qi[i];
int g=Math.abs(a[1]-a[1+k]);
for(int j=1;j<=k;++j) {
for(int o=j+k;o<=n;o+=k) {
int x=Math.abs(a[o]-a[j]);
if(x!=0)g=gcd(g, x);
}
}
if(g!=1)ans++;
}
System.out.println(ans);
T--;
}
}
public static int gcd(int a,int b) {
int res;
while(b!=0) {
res=a%b;
a=b;
b=res;
}
return a;
}
}