• 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);
        }
    }

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

  • 相关阅读:
    【PMP】商业论证与效益管理文件
    【PMP】项目生命周期和开发生命周期
    【PMP】组织级项目管理(OPM)和战略
    【PMP】项目和运营的区别
    【PMP】项目、项目集、项目组合
    【PMP】项目的定义和特点
    c++ 调用模板函数时加template什么意思?
    散列表
    Windows消息机制详解
    python 获取当前目录下文件(转)
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12303286.html
Copyright © 2020-2023  润新知