bc做的时候过了,后来T了,原来是memset的问题。。。
可能数据比较水 很多写法都过了
做法:
统计出每个出现的数字的出现次数,求一个gcd, 然后判断每一个能别gcd的整除的k
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int a[100010];
int sum[100010];
int in[100010];
int ino[100010];
int f[100010];
int gcd(int x,int y)
{
return x%y==0?y:gcd(y,x%y);
}
int n;
vector<int>v ;
vector<int>res;
bool judge(int k)
{
v.clear();
if(n%k)
return false;
for(int i =1; i<=k; i++)
{
v.push_back(a[i]);
in[a[i]]++;
}
int l = k+1;
while(l<=n)
{
for(int i = 0; i<v.size(); i++)
ino[v[i]] = 0;
for(int i = l; i<=l+k-1; i++)
ino[a[i]]++;
for(int i = 0; i<v.size(); i++)
{
if(in[v[i]]!=ino[v[i]])
{
for(int i = 0; i<v.size(); i++)
in[ v[i] ] = 0;
return false;
}
}
l+=k;
}
for(int i = 0; i<v.size(); i++)
in[ v[i] ] = 0;
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
v.clear();
res.clear();
scanf("%d",&n);
memset(f,0,sizeof(f));
for(int i = 1; i<=n; i++)
{
scanf("%d",&a[i]);
f[a[i]]++;
sum[i] =sum[i-1]+a[i];
}
int ans = f[a[1]];
for(int i =1; i<=n; i++)
{
ans = gcd(ans , f[a[i]]);
}
for(int i = ans; i>=1; i--)
{
if(ans%i==0)
{
if(judge(n/i))
{
res.push_back(n/i);
}
}
}
for(int i = 0; i<res.size()-1; i++)
{
printf("%d ",res[i]);
}
int g = res.size()-1;
printf("%d\n",res[g]);
}
return 0;
}