K倍区间 刷题笔记

法一 前缀和暴力搜索 (数据大会超时)

#include<iostream>

#include<cstring>

#include<algorithm>

#include<cstdio>

using namespace std;

const int N=100010;

int aN,sN;

int n,k;

int main(){

cin>>n>>k;

for(int i=1;i<=n;i++){

cin>>ai;

si=si-1+ai;

}

int cnt=0;

for(int i=1;i<=n;i++){

for(int j=1;j<=i;j++){

int ans=si-sj-1;

if(ans%k==0){

cnt++;

}

}

}

cout<<cnt;

return 0;

}`

法二 根据 式子推导

if((si-sj-1)%k==0)答案++;

换句话说 si和sj-1对k取模的余数是一样的

此处 拿样例

5 2

1 2 3 4 5

可以看到s1,s2,s5,对k取模的余数是一样的

且s0%k=0;

s2和s1,s5和s1,s5和s2能构成三个k倍区间

s3和s0,s4和s0,s4和s3能构成三个k倍区间所以一共六个K倍区间

因此

我们引出 开一个cnt数组来记录该余数的出现次数

例如 余数2出现了两次 说明当前已经有两个sl-1对k取模余数为2

后面一旦出现当前余数2 就可以与这两个sl-1形成k倍区间

所以 答案+上目前余数出现的次数

然后此时余数2已经出现三次 则让cnt2++;即cnt2=3;

将其标记为出现三次 后面一旦再出出现余数2的sr

答案直接+3 同时将余数2 标记成四次

代码

#include<iostream>

#include<cstring>

#include<algorithm>

#include<cstdio>

using namespace std;

typedef long long ll;

const int N=100010;

ll aN,sN,cntN;

ll n,k;

int main(){

cin>>n>>k;

for(int i=1;i<=n;i++){

cin>>ai;

si=si-1+ai;

}

ll res=0;

cnt0=1;

for(int i=1;i<=n;i++){

res+=cnts\[i%k];

cnts\[i%k]++;

}

cout<<res;

return 0;

}

相关推荐
sunoo-229几秒前
嵌入式Linux驱动学习笔记(第3-6天):从misc封装、platform总线到设备树、中断与单总线外设实战
linux·arm开发·驱动开发·笔记·单片机·学习
自不量力的A同学16 分钟前
MooTool Next 1.3.0 发布
笔记
志尊宝11 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
沪上企服通12 小时前
历史账套科目重映射与规则版本重算:旧账梳理的“口径复位”工程
笔记·架构
Go Work17 小时前
2026 Cadence SPB 24.1中文版安装图文详解(附安装包)
经验分享·笔记
ACP广源盛1392462567317 小时前
HDMI2.0 转 DP1.4 桥接方案评估:国产 GSV2125C@ACP 芯片选型笔记
笔记·硬件架构·hdmi·type-c·国产芯片
龙仔72517 小时前
RustDesk 自建服务器 Key 强校验配置笔记
运维·服务器·笔记
悟乙己18 小时前
AFAC2026 赛题四金融长文本 Agent竞赛学习笔记:赛题解析(一)
笔记·学习·金融
PC2005-cloud18 小时前
MySQL学习笔记:GTID 主从复制,从原理到实践,告别传统 Binlog+Position 的痛点
笔记·学习·mysql
悟乙己20 小时前
AFAC2026 赛题四金融长文本 Agent竞赛学习笔记:关联技术(二)
笔记·学习·金融