蓝桥杯——2.8K倍区间

题目描述:

蓝桥杯——2.8K倍区间_第1张图片

思路:

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MoTDVkDA-1637740441289)(D:\DownLoad\Pictures\csdn素材\2.jpg)](https://img-blog.csdnimg.cn/44be0918aed04e90b1aa8ce6beb10a3d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQ2F0X2jnjLQ=,size_20,color_FFFFFF,t_70,g_se,x_16)

AC代码

#include 
#include 

using namespace std;

int n, k;
typedef long long LL;
const int N = 100010;
LL s[N], cnt[N];                        // 由于数据范围过大,10^5的前缀和很可能爆int

int main()
{
     
    scanf("%d%d", &n, &k);
    
    LL res = 0;
    for (int i = 1; i <= n; i ++)
    {
     
        scanf("%lld", &s[i]);
        s[i] += s[i - 1];
    }
    
    cnt[0] = 1;                         // 这个地方很多争议
    // 只要数组的第一个数是k的倍数的时候,就会发现其实必须要加1
    // 从数学上理解就是,不加1的话,计算的是从L -> R 中的符合条件个数
    // 此时没有包括L,因此加1将L这个左端点包含进行
    for (int i = 1; i <= n; i ++)       // 枚举右端点
    {
     
        res += cnt[s[i] % k];
        cnt[s[i] % k] ++;
    }
    
    printf("%lld\n", res);
    
    return 0;
}

tf("%lld\n", res);

return 0;

}


你可能感兴趣的:(蓝桥杯,链表,c++,数据结构)