题目:
链接:https://ac.nowcoder.com/acm/contest/83391/F
来源:牛客网
王师哥很喜欢所有与数字 k 相关的事物。对于一个长度为 n 的数组 a,王师哥想知道是否存在一个区间使得这个区间的和是 k 的倍数,如果存在这个区间长度最大是多少,如果不存在则输出 “void”。
输入描述:
第一行两个整数 n,k(1≤n,k≤10e6 )。
链接:https://ac.nowcoder.com/acm/contest/83391/F
来源:牛客网
第二行 (0≤ai ≤2×10e9 )。
输出描述:
如果存在区间和为 k 的倍数的区间则输出最大区间长度,否则输出 “void”。
示例1
输入
3 5
1 2 4
输出
void
说明
对于样例一,无论怎么选取区间都不存在区间和为 k 的倍数,所有输出 void
。
示例2
输入
4 5
1 2 2 5
输出
4
说明
对于样例二,可以选取 (1,2,2)或(5)或(1,2,2,5),显然最大长度为 4。
代码
include[HTML_REMOVED]
using namespace std;
const int N=1e6+10;
long long a[N],sum,st[N],maxa;
int main()
{
int n,k;
cin>>n>>k;
memset(st,-1,sizeof st);
for(int i=1;i<=n;i)
{
cin>>a[i];
}
st[0]=0;//首个前缀和为k的倍数,不需要%k的左端点就可形成k倍区间,把0设置为左端点
//for(long long i=0;i<=n;i)从0遍历也可以满足
for(long long i=1;i<=n;i++)
{
sum=(sum+a[i])%k;
if(st[sum]==-1)
{
st[sum]=i;
}
else
{
maxa=max(maxa,i-st[sum]);
}
}
if(maxa) cout<<maxa<<endl;
else cout<<"void"<<endl;
return 0;
}
//前缀和对k取余相同,这个区间的和为k的倍数