zoukankan      html  css  js  c++  java
  • 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

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 2000ms

    通过前缀和加取模,

    然后要知道一个东西就是,只要前缀出现同样的就得累加,

    也就是一个累计数组。

    而且累计数组考虑的不包括本身,所以最后要吧取摸为零的加进去。

     1 #include <iostream>
     2 #define N 100000
     3 #define ll long long int
     4 using namespace std;
     5 ll an[N], bn[N];
     6 int n, k;
     7 
     8 int main(){
     9     cin >> n >> k;
    10     for(int i = 1; i <= n; i++ ){
    11         cin >> an[i];
    12         an[i] %= k;
    13     }
    14     for(int i = 1; i <= n; i++){
    15         an[i] = (an[i] + an[i-1])%k;
    16     }
    17     ll sum = 0;
    18     for(int i = 1; i <= n; i++){
    19         sum += (bn[an[i]]++);
    20     }
    21     cout << sum + bn[0] << endl;
    22     return 0;
    23 }
  • 相关阅读:
    JS完整获取IE浏览器信息
    C# DataSet和DataTable详解
    linux下mysql导入数据
    Linux上安装mysql
    JDK6+tomcat7+mysql官网下载地址
    Linux常用命令
    mysql 授权
    tomcat7.0学习笔记
    struts2 <s:property/>标签的使用输出时间格式转换
    Linux如何查找软件安装路径?
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/10578428.html
Copyright © 2011-2022 走看看