数论专题训练G (swust 1791)

 1791: 数论专题训练G

Time Limit: 1500MS Memory Limit: 65536KB
Total Submit: 41 Accepted: 26 Page View: 641
Submit  Status  Discuss
power给了毛哥n个数a1,a2,a3,a4……an并且power告诉了毛哥i到j的连续字段和的意思就是a[i]+a[i+1]+a[i+2]+…+a[j]。
现在毛哥想知道对于一串序列,在这个序列中到底有多少个连续的字段和可以被另外一个数m整除呢?
多组数据输入
对于每一组数据有两行输入
第一行输入两个数n m (0< n< 10000,0< m< 5000)
第二行输入n个数,每个数小于10000
输出可以被m整除的连续字段和的个数
5 4
1 2 3 4 5
6 7
9 8 7 6 5 4



题意:

中文题不多说。


思路:

如果区间 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值