题意:

  有一个环形序列,可以将其切成连续的k段子序列,那么gcd( 每段子序列的和 )就是优美程度。输出n个整数,表示当k=[1, n] 时的最大优美程度。

思路:

  观察一下,当切成1段的时候,gcd就是sum[整个序列],为最大。考虑切成2段,那么最好就是能让这个环切成2段和为sum[整个序列]/2的子序列了。考虑切成3段,那么最好就是能让这个环切成3段和为sum[整个序列]/3的子序列了。继续下去,这不就是求sum[整个序列]的约数吗?

  假设约数有k个,从大到小分别为factor[1~R]。那么其中有些因数是可能组不成的,得去掉那些组不成的。假设sum[整个序列]最多能切成cnt段和为factor[t]的连续子序列,那么段数i<=cnt的,答案都是factor[t]了,取最大即可。

  问题在于如何求出切成长为factor[t]的最多段数cnt[t]?当前缀和pre%factor=r出現了m次時应该是这样的: ..|xxxx|xxxx|......|xxx|xxxx|.. (共有m个切口|),观察到除了首尾之外,其他每段都是d的倍数,且首尾之和也是d的倍数(因为sum[整个序列]=k*d)。那么对于factor[t],只需要枚举r来求出最大的m即可。

 #include<bits/stdc++.h>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=;
vector<LL> factor, cnt;
LL a[N];
map<LL,LL> mapp;
int main()
{
freopen("input.txt","r",stdin);
int n;
while(~scanf("%d",&n))
{
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i]);
a[i]+=a[i-];
}
for(LL i=; i*i<=a[n]; i++)
{
if(a[n]%i==)
{
factor.push_back(a[n]/i);
factor.push_back(i);//多一个也不影响结果
}
}
sort(factor.begin(),factor.end());
deque<LL> ans;
for(int k=factor.size()-,i=; k>=; k--)
{
LL big=, c=factor[k];
mapp.clear();
for(int j=; j<=n; j++)
big=max(big,++mapp[a[j]%c]);
while(i<=n&&big>=i)
{
ans.push_back(c);
i++;
}
}
while(!ans.empty())
{
printf("%lld\n",ans.front());
ans.pop_front();
}
}
return ;
}

AC代码

hihoCoder #1246 : 王胖浩与环 (数学)的更多相关文章

  1. hihoCoder #1246 王胖浩与环

    题目大意 $n$($1\le n\le 2000$)个正整数 $a_1, a_2, \dots, a_n$($a_i\le 5\times 10^7$)分布在一个圆环上. 定义 $b_k$ 为:将环上 ...

  2. HihoCoder 1246:王胖浩与环

    #1246 : 王胖浩与环 时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 王胖浩有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字. 对 ...

  3. HihoCoder 1245:王胖浩与三角形 三角形边长与面积

    #1245 : 王胖浩与三角形 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 王胖浩有一个三角形,三边长为a,b,c.他有特殊的能力,能增加三条边的边长,增加的总长度不能 ...

  4. POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...

  5. HihoCoder - 1789:阶乘问题 (简单数学)

    描述 给定 n, k,求一个最大的整数 m,使得 km 是 n! 的约数 输入 第一行两个正整数 n, k 2 ≤ n,k ≤ 109 输出 输出最大的 m 样例输入 5 2 样例输出 3 思路:我们 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. C#编写的通过汉字得到拼音和五笔码

    public static class SpellAndWbConfig { #region 变量声明 // XML文件读取实例 /// <summary> /// XML文件读取实例 / ...

  8. .net 生成拼音码与五笔码

    首先加入配置文件: <?xml version="1.0" encoding="utf-8" ?> <CodeConfig> <S ...

  9. hibernate一对一主键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. Study on Algorithm of Selecting Safe Landing Area on Ground During Asteroid Soft Landing (EEIC2013 +161)

    OUATTARA Sie, RUAN Xiaogang, Yan yan Institute of Artificial Intelligence and Robots, School of Elec ...

  2. C#伪静态实现的方法

    在asp.net开发网站的时候,我们经常会用到伪静态,好处是可以隐藏真实的路径,提高网站的安全性,在官网等展示网站希望对搜索引擎友好,提高搜索排名:或者在涉及到模板开发都会用到伪静态.下面讲解下平时用 ...

  3. 使用反射来编写实体类的XML

    前言: 开发过程中经常需要返回某实体类的列表,公司通常用的都是XML格式的接口,小猪借鉴了公司前辈留下的代码一直是类似这么写的: public static string GetXMLList(ILi ...

  4. Assert断言测试

    assert编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在 ...

  5. js基础之数组

    数组方法 添加: push arr.push();//尾部添加 unshift arr.unshift();//头部添加 删除: pop arr.pop();//尾部删除 shift arr.shif ...

  6. EasyMock的原理及使用方法

    就不费劲转过来了https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/这上面介绍的比较全.

  7. NodeJs编写小爬虫

    一,爬虫及Robots协议 爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. robots.txt是一个文本文件,robots是一个协 ...

  8. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  9. 戴文的Linux内核专题:03驱动程序

    转自Linux中国 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件). Lin ...

  10. English idioms

    a hot potato : speak of an issue(mostly current) which many people are talking about and which is us ...