1791: 数论专题训练G
Time Limit: 1500MS Memory Limit: 65536KBTotal Submit: 41 Accepted: 26 Page View: 641
Submit Status Discuss
Description
power给了毛哥n个数a1,a2,a3,a4……an并且power告诉了毛哥i到j的连续字段和的意思就是a[i]+a[i+1]+a[i+2]+…+a[j]。 现在毛哥想知道对于一串序列,在这个序列中到底有多少个连续的字段和可以被另外一个数m整除呢?
Input
多组数据输入 对于每一组数据有两行输入 第一行输入两个数n m (0< n< 10000,0< m< 5000) 第二行输入n个数,每个数小于10000
Output
输出可以被m整除的连续字段和的个数
5 4 1 2 3 4 5 6 7 9 8 7 6 5 4
2 3
题意:
中文题不多说。
思路:
如果区间 0~i 的和对m取余的结果为sum,在区间 0~i 中找到一个 j 使得 0~j 的和对m取余结果仍为sum,那么相减得到 j~i 区间的和对m取余结果为0,即找到了一个区间 j~i 可以整除m、
所以对于这道题我们只需要计算到第 i 个元素时的前缀和对m的余数sum,并记录在之前一共有多少个 sum 即可。
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std;
int n,m;
int mp[5005];
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
memset(mp,0,sizeof(mp));
int sum = 0;
int ans = 0;
while(n--)
{
int x;
scanf("%d",&x);
sum = (sum + x) % m;
if(sum == 0)
ans ++;
if(mp[sum])
{
ans += mp[sum];
mp[sum] ++;
}
else
mp[sum] = 1;
}
printf("%d\n",ans);
}
return 0;
}