栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

k倍区间(前缀和)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

k倍区间(前缀和)

k倍区间-第八届蓝桥省赛-B组

给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。

你能求出数列中总共有多少个 K 倍区间吗?
输入格式:

第一行包含两个整数 N 和 K。

以下 N 行每行包含一个整数 Ai。

1≤N,K≤100000 , 1≤Ai≤100000
输出格式:

输出一个整数,代表 K 倍区间的数目。
输入样例:

5 2
1
2
3
4
5

输出样例:

在这里给出相应的输出。例如:

6
解题思路:
利用前缀和,可以求出[ l , r ]区间的所有数值和sum[ r ]-sum[ l-1 ],如果(sum[ r ]-sum[ l-1 ])%k=0,即
该区间符合条件,其中(sum[ r ]-sum[ l-1 ])%k=0可以化为sum[ r ]%k=sum[ l-1 ]%k,所以可以将判断条件变为,sum[ i ]对k取模后,统计每一种结果的数量;最后求每一种结果的可形成的组合数 C ( x , 2 )之和,再加上sum[ i ]%k=0的种类数就行了;

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int N=100010;
ll res[N];
int main()
{
    int n,k,i,a;
    ll num=0,sum=0;
    scanf("%d %d",&n,&k);
    for(i=0;i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号