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

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

  • 相关阅读:
    scapy学习笔记(4)简单的sniffing 嗅探
    scapy学习笔记(3)发送包,SYN及TCP traceroute 扫描
    Linux查看CPU和内存使用情况
    MySQL关于根据日期查询数据的sql语句
    JSON 数据格式
    利用PyCharm进行Python远程调试
    pycharm远程调试配置
    Linux终端使用技巧
    每天一个linux命令(60):scp命令
    python-docx 使用教程
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12303286.html
Copyright © 2020-2023  润新知