题目描述
小Biu潜心学习魔法,他发现魔法阵一定是一个正多边形(边数至少为3),而且正多边形的每个点上都有一个魔力值,整个魔法阵的魔力值就是正多边形的顶点上每个魔力值的和,现在小Biu有一个正n边形魔法阵,小Biu可以删掉这个魔法阵上的一些点,但是要保证删除之后这仍是一个魔法阵,也就是说删除一些点之后,剩余点仍然可以组成一个正多边形(边数至少为3),问小Biu能得到的魔力值最大的魔法阵的魔力值是多少?;
输入
第一行输入一个整数n(3≤n≤20000),表示初始的魔法阵的顶点个数。
第二行有n个整数t[1],t[2],t[3],…,t[n],表示每一个顶点的魔力值(-1000≤t[i]≤1000),两个整数之间用空格分开。
输出
输出答案占一行。
样例输入 Copy
8
1 2 -3 4 -5 5 2 3
样例输出 Copy
14
提示
样例中,可以去掉1,3,5,7四个点,剩余四点构成正方形,魔力值分别为2,4,5,3,此时总魔力值最大为14。
对于20%的数据,n<=20
对于40%的数据,n<=2000
对于100%的数据, n<=20000
//假设n=8,只能变成正四边形因为n的约数>=3.需要枚举几次呢
如上图其实只要枚举两次,因为第三次之后就重复了。然后暴力求和就行了。
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,k;
ll maxv;
ll a[N];
int main()
{
cin>>n;
ll sum=0;
ll ans=-0x3f3f3f3f;
for(int i=0;i<n;i++) cin>>a[i],sum+=a[i];
for(int i=3;i<n;i++)
{
if(n%i==0)
{
for(int j=0;j<n/i;j++)
{
ll res=0;
for(int p=j;p<n;p+=n/i)
{
res+=a[p];
}
ans=max(res,ans);
}
}
}
printf("%lld\n",max(ans,sum));
}