摘自题解:

题意转化一下就是:

给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除。

分析:

设这列数前i项和为s[i],

则一段连续的数的和 a[i]+a[i+1]+...+a[j-1]+a[j]=s[j]-s[i-1],

所以这段连续的数的和能被m整除的条件就是 (s[j]-s[i-1]) % m == 0,

即 s[j]%m-s[i-1]%m == 0,

因此,只需要每一个余数找使s[i]%m等于该余数的最小的i,和s[j]%m等于该余数的最大的j,相减即为最长的连续的数的长度。

然后,可以预处理一下,用一数组存下模相同几个前缀和的最小坐标,使得代码优化为O(N)的时间复杂度。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
#define M 100010 using namespace std; int p[M];
LL sum[M];
int main ()
{
int n, m;
LL x;
while(~scanf("%d %d",&n, &m))
{
for(int i = 0; i < m; ++i)
p[i] = INF;
for(int i = 1; i <= n; ++i)
{
scanf("%I64d", &x);
sum[i] = sum[i-1]+x;
int d;
if(sum[i]<=0)
{
d = sum[i]/m;
sum[i]+=m*(-d+1);
}
sum[i]%=m; p[sum[i]] = min(i,p[sum[i]]);
}
int ans = 0;
for(int i = 1; i <= n; ++i)
{
if(sum[i]==0)
ans = max(ans, i);
else
{
int t = i-p[sum[i]];
ans = max(ans, t);
}
}
printf("%d\n",ans);
}
return 0;
}

hdu 4648 - Magic Pen 6(“水”题)的更多相关文章

  1. HDU 4648 Magic Pen 6 (。。。。。。。。。。)

    Magic Pen 6 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  2. HDU 4648 Magic Pen 6

    题目链接 6Y什么水平.. #include <cstdio> #include <cstring> #include <string> #include < ...

  3. HDU 4648 Magic Pen 6 思路

    官方题解: 题意转化一下就是: 给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除. 分析: 设这列数前i项和为s[i], 则一段连续的数的和 a[i]+a[i+1] ...

  4. HDU 5578 Friendship of Frog 水题

    Friendship of Frog Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...

  5. HDU 5590 ZYB's Biology 水题

    ZYB's Biology Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...

  6. HDU 5538 L - House Building 水题

    L - House Building Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...

  7. hdu 1005:Number Sequence(水题)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. hdu 1018:Big Number(水题)

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. hdu 2041:超级楼梯(水题,递归)

    超级楼梯 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Su ...

随机推荐

  1. 洛谷P3366 【模板】最小生成树

    P3366 [模板]最小生成树 319通过 791提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 里面没有要输出orz的测试点 如果你用Prim写了半天都是W- 题目 ...

  2. C++去掉字符串中首尾空格和所有空格

    c++去掉首尾空格是参考一篇文章的,但是忘记文章出处了,就略过吧. 去掉首尾空格的代码如下: void trim(string &s) { if( !s.empty() ) { s.erase ...

  3. WinServer2008R2 部署.NET4.0程序 注意事项

    部署注意事项:   1.IIS应用程序池 集成模式   2.在web.config中的system.webServer下,添加 <modules runAllManagedModulesForA ...

  4. js事件委托,可以使新添加的元素具有事件(event运用)

    miaov视频教程  http://study.163.com/course/courseMain.htm?courseId=231002 <!DOCTYPE html PUBLIC " ...

  5. JAVA的Date类与Calendar类【转】

    Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...

  6. EMR,电子病历(Electronic Medical Record)

    电子病历 电子病历(EMR,Electronic Medical Record),也叫计算机化的病案系统或称基于计算机的病人记录(CPR,Computer-Based Patient Record). ...

  7. linux vim 替换指定字符为回车

    有个问题,想要知道逗号分隔的字符串  example: aaa,bbb,ccc 分隔后的个数 1 将   aaa,bbb,ccc 替换成 aaa bbb ccc 方法: :%s/,/^M/g ^M是用 ...

  8. 关于Log和adb知识

    1,打印日志:adb logcat -v time >log 2,清除以上日志:adb logcat -c 2,查看设备是否连接电脑:adb devices 3,登陆手机设备:adb shell ...

  9. nodejs 下载,安装,测试(windows环境下)

    1.下载 nodejs英文官网:http://nodejs.org/ nodejs中文官网:http://nodejs.cn/ 两个都可以下载,用户可以根据自己的网络来选择用哪个下载. 进入官网之后版 ...

  10. codeforces 361 D - Friends and Subsequences

    原题: Description Mike and !Mike are old childhood rivals, they are opposite in everything they do, ex ...