问题 A: 魔法阵

第二天叫醒我的不是闹钟,是梦想!

题目描述
小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));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值