E. Send Boxes to Alice

首先求出每一个位置的前缀和。

对答案进行复杂度为\(\sqrt{a[n]}\)的遍历,因为最后的答案不可能大于\(\sqrt{a[n]}\)

for(ll j=2;j*j<=a[n];++j)
if(a[n]%j==0)
{
Try(j);
while(a[n]%j==0)
a[n]/=j;
}

Try(j)函数中,求的是当因子为\(j\)时的操作数量

void Try(ll k)
{
ll temp=0;
for(int i=1;i<n;++i)
temp+=min(a[i]%k,k-a[i]%k);
// tst(k,temp);
best=min(best,temp);
}

\(temp+=min(a[i]\%k,k-a[i]\%k)\)的原因是在位置\(i\)上,如果不是\(k\)的倍数,那么,要么是将这个位置上的多出来的糖放到后面去,要么从后面拿糖过来。

取这两种方法的最小值,最后再求一个极值。

另外还要注意的一点是,无穷大要开得足够大,不然也会wa

代码:

// Created by CAD on 2019/11/23.
#include <bits/stdc++.h>
#define INF 0x7fffffffffffffff
#define ll long long
using namespace std; const int maxn=1e6+5;
ll a[maxn];
ll best=INF,n;
void Try(ll k)
{
ll temp=0;
for(int i=1;i<n;++i)
temp+=min(a[i]%k,k-a[i]%k);
// tst(k,temp);
best=min(best,temp);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i],a[i]+=a[i-1];
for(ll j=2;j*j<=a[n];++j)
if(a[n]%j==0)
{
Try(j);
while(a[n]%j==0)
a[n]/=j;
}
if(a[n]!=1) Try(a[n]);
cout<<(best==INF?-1:best)<<endl;
return 0;
}

最新文章

  1. yield和python(如何生成斐波那契數列)
  2. Convert IPv6 Address to IP numbers (C#)
  3. J2EE基础总结(1)——J2EE入门
  4. AAM(Active Appearance Model)算法介绍
  5. 2机器学习实践笔记(k-最近邻)
  6. PHP_零基础学php_2变量、预定义变量、预定义常量、表达式、运算符、程序控制流程
  7. libtiff库使用
  8. HTML5 客户端存储数据的两种方式
  9. 改变input的placeholder颜色
  10. Android图表库MPAndroidChart(七)—饼状图可以再简单一点
  11. Apache 2.4.27 局域网访问提示 You don&#39;t have permission to access / on this server
  12. EXcel vba 获取批注信息
  13. java Swing小知识点
  14. [LeetCode&amp;Python] Problem 520. Detect Capital
  15. java常用设计模式五:建造者模式
  16. Android Studio之could not reserve enough space for object heap报错
  17. mongodb 在 Ubuntu系统上的安装及卸载
  18. 题目1003:A+B(字符串转数字)
  19. 10、List、Set
  20. 关于static关键字

热门文章

  1. (六)Struts的简单异常处理
  2. (一)Struts2 基础
  3. (四)XML基础(客户端和服务端发送与接收xml数据)
  4. 在论坛中出现的比较难的sql问题:3(row_number函数 分组查询)
  5. krpano 全景学习
  6. sublimeText3汉化安装教程 附注册码
  7. sftp配置多个用户权限的问题
  8. MySQL数据库的二进制安装、源码编译和基础入门操作
  9. PP 各种快捷键
  10. 深入理解Kubernetes资源限制:内存