hdu_5908_Abelian Period(暴力)

本文提供了一种解决HDU 5908 AbelianPeriod问题的有效方法,通过枚举k值并验证其是否为n的约数来判断其是否符合条件,最终确定所有符合条件的k值。

题目链接:hdu_5908_Abelian Period

题意:

给你n个数字,让你找出所有的k,使得把这n个数字分为k分,并且每份的数字种类和个数必须相同

题解:

枚举k,首先k必须是n的约数,然后就能算出每个数字应该出现多少次,O(n)检验即可。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=1e5+7;
 6 int t,n,a[N];
 7 map<int,int>A,B;
 8 map<int,int>::iterator it;
 9 int ans[N],ed;
10 
11 int main(){
12     scanf("%d",&t);
13     while(t--)
14     {
15         scanf("%d",&n),ed=0;
16         F(i,1,n)scanf("%d",a+i);
17         int be=1;
18         while(be<=n)
19         {
20             while(be<n&&n%be!=0)be++;
21             if(n%be==0)
22             {
23                 A.clear();
24                 F(i,1,be)A[a[i]]++;
25                 int en=n/be,fg=0;
26                 F(i,2,en)
27                 {
28                     B=A;
29                     int s=(i-1)*be+1,t=s+be-1;
30                     F(j,s,t)B[a[j]]--;
31                     for(it=B.begin();it!=B.end();it++)
32                     {
33                         if(it->second!=0){fg=1;break;}
34                     }
35                     if(fg)break;
36                 }
37                 if(fg==0)ans[++ed]=be;
38             }
39             be++;
40         }
41         F(i,1,ed)printf("%d%c",ans[i],i==ed?'\n':' ');
42     }
43     return 0;
44 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5926483.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值