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