数组预处理

来源:互联网 发布:云房数据怎么样 编辑:程序博客网 时间:2024/06/05 16:11
标题: 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 21  2  3  4  5  程序应该输出:6资源约定:峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2000ms

这道题在考场上我想暴力是过不了大数据的,所以没写,看别人的代码都是无脑暴力的,我总是感觉会超时啊,这里的时间复杂度的计算我不是很会计算。以后再瞅瞅。

这道题我还学了一个东西,

int sum=0;int a=1;printf("%d\n",sum+(a++));

这个地方即使有括号也会先加a,再执行++操作。

#include <bits/stdc++.h>using namespace std;int a[100010];long long dp[100010];int main(){    int n,k,i,j;    scanf("%d%d",&n,&k);    dp[0]=0;    for(i=1;i<=n;i++)    {        scanf("%d",&a[i]);        dp[i]=dp[i-1]+a[i];    }    int ans=0;    for(i=1;i<=n;i++)    {        for(j=0;j<=n-i;j++)        {            if((dp[j+i]-dp[j])%k==0)                ans++;        }    }    printf("%d\n",ans);    return 0;}


0 0