官方题解:

题意转化一下就是:

给出一列数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,相减即为最长的连续的数的长度。

i 要从1开始,不然会WA。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ; int n, mod;
int maxPos[MAXN];
int minPos[MAXN]; int main()
{
//freopen( "1006.in", "r", stdin );
//freopen( "s.txt", "w", stdout );
while ( ~scanf( "%d%d", &n, &mod ) )
{
memset( maxPos, -, sizeof(maxPos) );
memset( minPos, -, sizeof(minPos) );
int sum = ;
minPos[] = ;
for ( int i = ; i <= n; ++i )
{
int a;
scanf( "%d", &a );
sum += a;
sum %= mod;
if ( sum < ) sum += mod; if ( minPos[sum] == - )
minPos[sum] = i;
maxPos[sum] = i;
}
int ans = ;
for ( int i = ; i < mod; ++i )
if ( maxPos[i] != - && minPos[i] != - )
{
ans = max( ans, maxPos[i] - minPos[i] );
}
printf( "%d\n", ans );
}
return ;
}

最新文章

  1. Android提权漏洞CVE-2014-7920&amp;CVE-2014-7921分析
  2. (转)内网网站发布到外网-nat123动态公网IP动态域名解析
  3. [Open Projects Series] ViewPagerTransforms
  4. 地址栏访问Action,后来方法执行两次
  5. ubuntu 下源码安装Postgreql pgAdmin3
  6. 快速构建Windows 8风格应用34-构建Toast通知
  7. Linux时间子系统之五:低分辨率定时器的原理和实现
  8. SQL Server脚本
  9. 使用Git Bash上传代码到新的分支
  10. python网络编程-udp
  11. vue单页应用添加百度统计
  12. vuejs 单文件组件.vue 文件
  13. Mybatis 中获得 connection
  14. Java之旅_高级教程_网络编程
  15. MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
  16. [剑指Offer]12-矩阵中的路径(回溯)
  17. 安恒月赛WP
  18. [BZOJ4561][JLOI2016]圆的异或并(扫描线)
  19. django重写form表单中的局部钩子函数
  20. 正则表达式复习 (?&lt;=) (?=)

热门文章

  1. 转载------------------关于android的一些技巧
  2. 文件和文件夹同步工具AFiles 1.0 发布
  3. File &quot;/struts-tags&quot; not found
  4. JNA使用
  5. 【BZOJ】【3907】网格
  6. BZOJ3170: [Tjoi 2013]松鼠聚会
  7. sublime 3 注册码
  8. DSP中常用的C语言关键字
  9. Jmeter测试Mysql
  10. 接口、抽象类、方法复写、类Equals方法重写