【NOIP2017提高组模拟12.17】环
题目
小A有一个环,环上有n个正整数。他有特殊的能力,能将环切成k段,每段包含一个或者多个数字。对于一个切分方案,小A将以如下方式计算优美程度:
首先对于每一段,求出他们的数字和。然后对于每段的和,求出他们的最大公约数,即为优美程度。
他想通过合理地使用他的特殊能力,使得切分方案的优美程度最大。
分析
首先知道,每个可能的优美程度一定是\(\sum a_i(=m)\)的约数,
因为m的约数最多只有4000多个,
所以,我们枚举m的约数i,
将a所有数mod i
发现假设某个余数为j(i>j),
分布最这些地方:
那么每两个余数为j夹着的区间(因为这是环,所以头尾合在一起也当做一个区间)一定能被i整除,
也就是说,这个环最多可以被分成j的个数个段,以及i这个优美程度可以最多可以将环分成i段。
这个处理j的个数可以用快排,如何想快点可以用hash。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int N=4005;
using namespace std;
long long a[N],n,mx[N],t[N*N],m,b[N];
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++) scanf("%lld",&a[i]),m+=a[i];
for(int i=1;i<=n;i++) a[i]+=a[i-1];
mx[1]=m;
b[0]=-1;
b[n+1]=-1;
for(long long i=1;i<=sqrt(m);i++)
if(m%i==0)
{
long long mo=i;
for(int i1=1;i1<=n;i1++) b[i1]=a[i1]-a[i1]/mo*mo;
sort(b+1,b+1+n);
int sum=0,mx1=1;
for(int i1=1;i1<=n+1;i1++)
{
if(b[i1]!=b[i1-1])
{
mx1=max(mx1,sum);
sum=1;
}
else sum++;
}
mx[mx1]=max(mx[mx1],mo);
mo=m/i;
for(int i1=1;i1<=n+1;i1++) b[i1]=a[i1]-a[i1]/mo*mo;
sort(b+1,b+1+n);
sum=0;
mx1=1;
for(int i1=1;i1<=n;i1++)
{
if(b[i1]!=b[i1-1])
{
mx1=max(mx1,sum);
sum=1;
}
else sum++;
}
mx[mx1]=max(mx[mx1],mo);
}
for(int i=n;i>=1;i--)
mx[i]=max(mx[i],mx[i+1]);
for(int i=1;i<=n;i++) printf("%lld\n",mx[i]);
}
【NOIP2017提高组模拟12.17】环的更多相关文章
- 【JZOJ4922】【NOIP2017提高组模拟12.17】环
题目描述 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和 ...
- 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)
前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...
- 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
题目描述 Alice和Bob有一棵树(无根.无向),在第i个点上有ai个巧克力.首先,两人个选择一个起点(不同的),获得点上的巧克力:接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都 ...
- 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见
题目描述 数据范围 =w= 设h[i]表示,甲队得到i分的方案数. 那么h[(n+k)/2]和h[(n−k)/2]就是答案. 设g[i]表示,甲队得到至少i分的方案数. 那么h[i]=g[i]−∑j& ...
- 【NOIP2017提高组模拟12.24】B
题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...
- 【NOIP2017提高组模拟12.10】幻魔皇
题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...
- 【NOIP2017提高组模拟12.10】神炎皇
题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
题目描述 给出一个H的行和W列的网格.第i行第j列的状态是由一个字母的A[i][j]表示,如下: "." 此格为空. "o" 此格包含一个机器人. " ...
- 【JZOJ4929】【NOIP2017提高组模拟12.18】B
题目描述 在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了,保证 ...
随机推荐
- java:struts框架5(Converter,Validation,Tags(Object-Graph Navigation Language))
1.Converter: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ...
- Smartform给文本绑定值
点击字段显示器, 然后把字段拖过去即可
- opencv的频域滤波
下面是频域滤波示例程序: 在本程序中,共有五个自定义函数,分别是: 1. myMagnitude(),在该函数中封装了Opencv中的magnitude函数,实现对于复数图像的幅值计算. 2. dft ...
- 使用 Python* 的英特尔® 分发版实现 Unity* 机器学习入门(第 1 部分)
本文将向游戏开发人员介绍如何使用强化学习创建更好的人工智能 (AI) 行为.使用Python* 的英特尔® 分发版 — 常用面向对象的高级编程语言的进阶版 — 读者可收集关于如何训练预先存在的机器语言 ...
- Python学习之GIL&进程池/线程池
8.6 GIL锁** Global interpreter Lock 全局解释器锁 实际就是一把解释器级的互斥锁 In CPython, the global interpreter lock, or ...
- heartbeat双主高可用
一.基础配置 1.hostnamectl set-hostname node1 (node2) 2.[root@node1 ~]# cat /etc/hosts 192.168.40.128 ...
- HDU 1029 Ignatius and the Princess IV (动态规划、思维)
Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32767 K ( ...
- [Python3] 032 常用模块 random
目录 random 1. random.random() 2. random.choice() 3. random.shuffle() 4. random.randint() 5. random.ra ...
- 在Bean中获取spring 容器 并通过容器获取容器中其他bean
spring 提供了Awear 接口去 让bean 能感受到外界的环境.Awear 接口有很多实现,常用的有 ApplicationContextAware (可以通过实现这个接口去获取Applica ...
- MyBatis按时间排序
测试代码 ActivityReadExample readExample = new ActivityReadExample(); readExample.setOrderByClause(" ...