HDU 5908 Abelian Period

来源:互联网 发布:路由器wifi网络延迟高 编辑:程序博客网 时间:2024/06/05 08:53

题目分析

这道题告诉我们虽然是暴力题目但是仍然要有策略的暴力,首先这道题写的时候利用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;}
0 0