1414 冰雕
白兰大学正在准备庆祝成立256周年。特别任命副校长来准备校园的装扮。
校园的中心竖立着n个冰雕。这些雕像被排在一个等分圆上,因此他们形成了一个正n多边形。这些冰雕被顺针地从1到n编号。每一个雕有一个吸引力t[i].
校长来看了之后表示不满意,他想再去掉几个雕像,但是剩下的雕像必须满足以下条件:
· 剩下的雕像必须形成一个正多边形(点数必须在3到n之间,inclusive),
· 剩下的雕像的吸引力之和要最大化。
请写一个程序帮助校长来计算出最大的吸引力之和。如果不能满足上述要求,所有雕像不能被移除。
Input
单组测试数据。 第一行输入一个整数n(3≤n≤20000),表示初始的冰雕数目。 第二行有n个整数t[1],t[2],t[3],…,t[n],表示每一个冰雕的吸引力(-1000≤t[i]≤1000),两个整数之间用空格分开。
Output
输出答案占一行。
Input示例
8
1 2 -3 4 -5 5 2 3
6
1 -2 3 -4 5 -6
Output示例
14
9
//必然是 n 的因子,才能剩下的数为正多边形,然后枚举一下多边形的所有情况,暴力枚举找最大
1 # include <cstdio> 2 # include <cstring> 3 # include <cstdlib> 4 # include <iostream> 5 # include <vector> 6 # include <queue> 7 # include <stack> 8 # include <map> 9 # include <bitset> 10 # include <sstream> 11 # include <set> 12 # include <cmath> 13 # include <algorithm> 14 # pragma comment(linker,"/STACK:102400000,102400000") 15 using namespace std; 16 # define LL long long 17 # define pr pair 18 # define mkp make_pair 19 # define lowbit(x) ((x)&(-x)) 20 # define PI acos(-1.0) 21 # define INF 0x3f3f3f3f3f3f3f3f 22 # define eps 1e-8 23 # define MOD 1000000007 24 # define MX 20005 25 /**************************/ 26 int dat[MX]; 27 28 int main() 29 { 30 int n, ans= 0; 31 scanf("%d",&n); 32 for (int i=1;i<=n;i++) 33 { 34 scanf("%d",&dat[i]); 35 ans+=dat[i]; 36 } 37 for (int i=2;i<=n;i++) 38 { 39 if (n%i==0) 40 { 41 int pt = n/i; // 点数 42 if (pt<3) break; 43 int star=1; 44 while (star<=i) 45 { 46 int tp=0; 47 for (int j=star;j<=n;j+=i) 48 tp+=dat[j]; 49 ans = max(ans,tp); 50 star++; 51 } 52 } 53 } 54 printf("%d\n",ans); 55 return 0; 56 }