解题思路:
枚举周期的大小,可以发现周期应该是数字个数的约数,并且该周期的倍数如果也是数字个数的约数的话,也是一定可以成为完全阿贝尔周期。
代码:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
int n;
int vis[100005];
int a[100005];
bool ok(int x){
map<int,int>mp1;
for(int i=0;i<x;i++)
mp1[a[i]]++;
map<int,int>mp2;
for(int i=x;i<n;i+=x){
mp2.clear();
for(int j=i;j<i+x;j++){
mp2[a[j]]++;
}
if(mp1!=mp2)
return false;
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
vector<int> ans;
for(int i=1;i<n;i++){
if(n%i==0&&ok(i)&&!vis[i]){
ans.push_back(i);
vis[i]=1;
for(int j=i+i;j<n;j+=i)
if(n%j==0&&!vis[j]){
ans.push_back(j);
vis[j]=1;
}
}
}
ans.push_back(n);
sort(ans.begin(),ans.end());
int len=ans.size();
for(int i=0;i<len;i++){
printf("%d%s",ans[i],i==len-1?"\n":" ");
}
}
return 0;
}