• NOJ1329:[蓝桥杯2017初赛]k倍区间-(前缀和)


    题目描述

    给定一个长度为N的数列,A1, A2, ... AN。 
    如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。   
    你能求出数列中总共有多少个K倍区间吗?  

    输入

    第一行包含两个整数N和K。(1 <= N, K <= 100000)   
    以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)   

    输出

    输出一个整数,代表K倍区间的数目。 

    样例输入

    5 2
    1
    2
    3
    4
    5

    样例输出

    6

    题解:加减对模没有影响,累计前缀和,sum[i]表示原数组1-i这个区间的前缀和对k求模的结果,则区间i-j表示方法可以表示为(sum[j]-sum[i-1]),(sum[j]-sum[i-1])%k==0可以表示为sum[j]%k==sum[i-1]%k,如果相同,则相减后对k求模的结果为0表示一个正确答案区间。遍历过程中看看前面有多少个前缀和求模结果相同的,再做一个计数数组m,注意初始m[0]=1。

     

    public class Main{
        public static void main(String []args){    
            Scanner scan=new Scanner(System.in);
            //int[] a=new int[100086];
            int[] sum=new int[100086];
            int[] m=new int[100086];
            int n=scan.nextInt();
            int k=scan.nextInt();
            int x=0;
            for(int i=1;i<=n;i++) {
                x=scan.nextInt();
                sum[i]=(sum[i-1]+x)%k;
            }
            long ans=0;
            m[0]=1;
            for(int i=1;i<=n;i++) {
                ans=ans+m[ sum[i] ];
                m[ sum[i] ]++;
            }
            System.out.println(ans);
        }
    }

    天上不会掉馅饼,努力奋斗才能梦想成真。

  • 相关阅读:
    [Python3网络爬虫开发实战] 3.1.3-解析链接
    pusher-http-go
    gopush-cluster 架构
    消息队列 redis vs nsq
    redis资料
    golang+websocket
    golang之flag.String
    Linux环境下安装mysql
    golang版的crontab
    golang实现wav文件转换为mp3文件
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12303286.html
Copyright © 2020-2023  润新知