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
    #include<stdio.h>
    #define N 100000 
    int main()
    {
        int a,b,shu[N],sum[N],cnt[N],k;
        scanf("%d %d",&a,&k);
        for(b=1;b<=a;b++)
        scanf("%d",&shu[b]);
        sum[0]=0;
        cnt[0]=1;
        for(b=1;b<=a;b++)
        {
            sum[b]=(sum[b-1]+shu[b])%k;//前缀和 
            cnt[sum[b]]++;
        }
         long long ans=0;
        for(b=0;b<k;b++) 
        {
          ans+=(long long)(cnt[b])*(cnt[b]-1)/2;
          }
           printf("%lld",ans);
           return 0;
    }

    注释:这道题是历届真题,还是一道压轴题,用枚举的方法是可一些出来的,但是他的测试数据非常大,运行超时,所以说简单的枚举是不行的,需要优化,然而简单的应用前缀和这个思想是不行,时间复杂度还是平方阶,这时候需要数学方法来解决,不愧是压轴题;

  • 相关阅读:
    关于第三方库
    一些css属性,抄自某个大神忘记谁了,不好意思
    10.使用express模拟数据服务器
    9.text-shadow
    8.css背景图案
    7.一个抄来圆形菜单
    6.文字闪烁效果
    5.偶然看到的一个css加载动画
    4.怎样使用css实现一个切角效果
    3.写一个简单的弹出菜单
  • 原文地址:https://www.cnblogs.com/saber114567/p/8399203.html
Copyright © 2011-2022 走看看