HDU5908【模拟】

思路:
找到约数k,然后算一下1-k区间里的数的个数。
中间交换一下就好了,然后把后面每个区间里的数减减,然后再判断一下满足不满足= =

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=1e5+10;
int a[N];
map<int,int>tmp1,tmp2;

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            if(n%i==0)
            {
                int flag=1;
                tmp1.clear();
                for(int j=1;j<=i;j++)
                    tmp1[a[j]]++;

                int k=n/i;
                for(int j=2;j<=k;j++)
                {
                    tmp2=tmp1;
                    int s=(j-1)*i+1;
                    int t=s+i-1;
                    for(;s<=t;s++)
                        tmp2[a[s]]--;
                    map<int,int>::iterator it;
                    for(it=tmp2.begin();it!=tmp2.end();it++)
                    {
                        if(it->second!=0)
                        {
                            flag=0;
                            break;
                        }
                    }
                    if(!flag)
                        break;
                }
                if(flag)
                {
                    if(i!=n)
                        printf("%d ",i);
                    else
                        printf("%d",n);
                }
            }
        }
        puts("");
    }
    return 0;
}
posted @ 2016-10-02 00:26  see_you_later  阅读(160)  评论(0编辑  收藏  举报