题目描述

小A有一个环,环上有n个正整数。他有特殊的能力,能将环切成k段,每段包含一个或者多个数字。对于一个切分方案,小A将以如下方式计算优美程度:

首先对于每一段,求出他们的数字和。然后对于每段的和,求出他们的最大公约数,即为优美程度。

他想通过合理地使用他的特殊能力,使得切分方案的优美程度最大。

数据范围

对于100%的数据,n<=2000,1<=ai<=50000000(5e7)

=w=

设sum=∑ai,

那么答案一定是sum的约数。

证明:

如果存在一个答案ans不是sum的约数,那么切分出来的每一段之和都会是ans的倍数;

每一段的和(也就是sum)就会是ans的倍数。

矛盾。

如果切分i段的答案为ans[i],那么对于所有j>i,切分j段的答案至少为ans[i]。

证明:

通过子段合并,显然可得。


于是我们得出思路:

枚举sum的一个约数i,容易用哈希表加上O(2n)的时间得出最小的j使得ans[j]=i。

代码

// DO NOT FORGET TO OPEN LL
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="aP1.in";
const char* fout="aP1.out";
const ll inf=0x7fffffff;
const ll maxn=4007,maxp=100000,maxh=99997;
ll n,m,i,j,k;
ll a[maxn],w[maxn],ans[maxn],pre[maxn],sum[maxn];
ll id[maxn];
ll h[maxh],cnt[maxh];
ll getsum(ll l,ll r){
return pre[r]-pre[l-1];
}
ll hash(ll v){
ll k=v%maxh;
while (h[k] && h[k]!=v) k=(k+1)%maxh;
return k;
}
void add(ll x){
ll i=hash(sum[x]+1);
id[x]=i;
if (h[i]==0){
h[i]=sum[x]+1;
cnt[i]=1;
}else cnt[i]++;
}
void del(ll x){
ll i=id[x];
cnt[i]--;
if (!cnt[i]) h[i]=0;
}
ll find(ll x){
ll i=id[x];
if (h[i]) return cnt[i];
else return 0;
}
void solve(ll v){
ll i,j,k,cnt=0,tmp=0;
sum[0]=0;
for (i=1;i<=n;i++) sum[i]=(sum[i-1]+a[i])%v;
for (i=1;i<=n/2;i++) add(i);
for (i=n/2+1;i<=n;i++){
//tong[sum[i-n/2]]--;
del(i-n/2);
add(i);
if (sum[i]==sum[i-n/2]){
tmp=max(find(i-n/2),tmp);
}
}
w[tmp]=max(w[tmp],v);
for (i=n/2+1;i<=n;i++) del(i);
}
int main(){
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a[i]),m+=a[i];
for (i=n+1,j=n*2;i<=j;i++) a[i]=a[i-n];
for (i=1;i<=n;i++) pre[i]=a[i]+pre[i-1];
n=n*2;
for (i=1,j=(ll)sqrt(m);i<=j;i++){
if (m%i==0) solve(i),solve(m/i);
}
k=1;
for (i=n/2;i>0;i--){
k=max(k,w[i]);
ans[i]=k;
}
for (i=1;i<=n/2;i++) printf("%lld\n",ans[i]);
return 0;
}

=o=

其实优化容易想到。

我没深入思考= =

【JZOJ4922】【NOIP2017提高组模拟12.17】环的更多相关文章

  1. 【NOIP2017提高组模拟12.17】环

    题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...

  2. 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)

    前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...

  3. 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢

    题目描述 Alice和Bob有一棵树(无根.无向),在第i个点上有ai个巧克力.首先,两人个选择一个起点(不同的),获得点上的巧克力:接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都 ...

  4. 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见

    题目描述 数据范围 =w= 设h[i]表示,甲队得到i分的方案数. 那么h[(n+k)/2]和h[(n−k)/2]就是答案. 设g[i]表示,甲队得到至少i分的方案数. 那么h[i]=g[i]−∑j& ...

  5. 【NOIP2017提高组模拟12.24】B

    题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...

  6. 【NOIP2017提高组模拟12.10】幻魔皇

    题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...

  7. 【NOIP2017提高组模拟12.10】神炎皇

    题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...

  8. 【JZOJ4930】【NOIP2017提高组模拟12.18】C

    题目描述 给出一个H的行和W列的网格.第i行第j列的状态是由一个字母的A[i][j]表示,如下: "." 此格为空. "o" 此格包含一个机器人. " ...

  9. 【JZOJ4929】【NOIP2017提高组模拟12.18】B

    题目描述 在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了,保证 ...

随机推荐

  1. ROS 日志消息(C++)

    1.日志级别 日志消息分为五个不同的严重级别宏,与Android的Log定义的严重级别类似,如下基础宏: ROS_DEBUG_STREAM.ROS_INFO_STREAM.ROS_WARN_STREA ...

  2. 禁用 ipv6

    # 禁用整个系统所有接口的IPv6 net.ipv6.conf.all.disable_ipv6 = # 禁用某一个指定接口的IPv6(例如:eth0, lo) net.ipv6.conf.lo.di ...

  3. Java通过接口或者抽象类调用方法的时候,怎么知道调用的是哪个实现类里的方法?

    用对象的 getClass() 方法获得它的类,之后就可以随意去判断这是哪个实现类了. 比如代码1-1所示的JDBC连接池的代码,我们想要知道conn调用的close方法是释放连接还是归还连接, 我们 ...

  4. oracle数据导入/导出(2)

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢 ...

  5. javascript基础:语法与html结合方式

    一.基本语法: 1.与html结合方式 1.内部JS: *  定义<script>,标签体内容就是JS代码 2.外部JS: *  定义<script>,通过src属性引入外部的 ...

  6. vue如何发请求

    1.vue 支持开发者引入 jquery 使用 $.ajax() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.首先,在 package.json 中添加 j ...

  7. 【python之路34】面向对象作业之学生选课系统

    一.需求: 1.可以注册管理员账号,管理员账号可以创建老师和课程 2.学生可以注册和登陆,学生可以从课程列表选课,可以进行上课登记查看 二.代码 1.文件目录 bin 存放可执行文件 config 存 ...

  8. loj6402 校门外的树(dp,多项式求逆)

    https://loj.ac/problem/6402 庆祝一下,,,第一个我自己做出来的,,,多项式的题(没办法,我太弱 虽然用了2个小时才想出来,但这毕竟是0的突破…… 首先声明,虽然我写的题解很 ...

  9. 理解es6箭头函数

    箭头函数知识点很少,但是要理解清楚,不然看代码会很不适应的. 1. 最简单的写法 x => x*x 可以理解为 我的x要被转化为x*x,所以实际相当于下边的这个 function (x){ re ...

  10. mybatis深入理解(三)-----MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...