题目分析
这道题告诉我们虽然是暴力题目但是仍然要有策略的暴力,首先这道题写的时候利用hash的思想存储一段中每个数出现的次数。然后利用了素数筛法的思想,具体看代码吧。这道题是BC的b题,难度肯定是不大的,因此也不需要下特别多,拿过来瞎搞就可以了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+100;
bool vis[maxn];
int a[maxn], c1[maxn], c2[maxn];
bool judge(int k, int n){
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for(int i = 1; i <= k; i++) c1[a[i]]++;
for(int i = 2; i <= n/k; i++)
{
int l = (i-1)*k+1;
int r = i*k;
for(int j = l; j <= r; j++)
{
c2[a[j]]++;
if(c2[a[j]] > c1[a[j]]) return false;
}
for(int j = l;j <= r; j++)
c2[a[j]]--;
}
return true;
}
void solve(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(vis, false, sizeof(vis));
for(int i = 1; i <= n; i++){
if(n%i==0 && !vis[i]){
if(judge(i, n)){
for(int j = i; j <= n; j += i) vis[i] = true;
}
}
}
int first = 1;
for(int i = 1; i <= n; i++)
if(vis[i]){
if(first){ printf("%d", i); first = 0; }
else printf(" %d", i);
}
printf("\n");
}
int main(){
int T;
scanf("%d", &T);
while(T--){
solve();
}
return 0;
}