K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)

news/2024/10/18 18:27:58/

题目描述

给定一个长度为 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

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 256M

 看到这道题首先就想到不停地遍历,找到符合条件的就可以计数

#include <bits/stdc++.h>
using namespace std;int N;
int a[100000];
int K;
int ans;
int main()
{cin>>N>>K;for(int i=0;i<N;i++){cin>>a[i];}for(int i=0;i<N;i++){if(a[i]%K==0){ans++;}for(int j=i+1;j<N;j++){a[i]=a[i]+a[j];if(a[i]%K==0){ans++;}}}cout<<ans;return 0;
}

 当然,通过分析,两层for循环时间复杂度为O(n*n),运行超时

所以,只能想办法找到更好的办法

 

 正确代码:(用到排列组合知识)

#include <bits/stdc++.h>
using namespace std;
long long mod[100010]={0},add[100010]={0};
long long sum=0,a[100010];
int main()
{int n,k;long long cnt=0;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){sum=sum+a[i];mod[i]=sum%k;add[mod[i]]++;}for(int i=0;i<n;i++){cnt+=add[i]*(add[i]-1)/2;}cout<<cnt+add[0];return 0;
}


http://www.ppmy.cn/news/714117.html

相关文章

c语言之求n以内最大的k个素数以及它们的和

描述 编写程序&#xff0c;计算并输出不超过n的最大的k个素数以及它们的和。 输入 在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。 输出 在一行中按下列格式输出: 素数1素数2…素数k总和值 其中素数按递减顺序输出。若n以内不够k个素数&#xff0c;则按实际个数输出。 输…

查找第K小元素(C语言版)

今天在看《算法&#xff1a;C语言实现》时&#xff0c;在快速排序那一章最后一节讲述了利用快速排序的思想&#xff0c;快速排序每次划分后在枢轴的左边的元素都比枢轴小(或相等)&#xff0c;在枢轴右边的数都比枢轴大(或相等)&#xff0c;而划分后枢轴本身就放在了(有序时)它自…

【已解决】C语言从n个不同的元素中,每次取出k个不同的元素

本博文源于c语言基础&#xff0c;旨在通过对思路的解释&#xff0c;编写出组合数的代码&#xff0c;博文分为以下模块1、问题再现&#xff0c;2、代码测试效果3、核心解题思路4、完整源码 重点看解题思路 1、问题再现 从n个不同的元素中&#xff0c;每次取出k个不同的元素&am…

C语言学习之求∑k(k=100)+∑K*k(k=50)+∑1/k(k=10)

求∑k(k100)∑K*k(k50)∑1/k(k10) #include <stdio.h> #include <math.h> void main(){double as0,bs0,cs0;for(int i1;i<100;i){asi;}printf("1...100%d\n",as);for(int j1;j<50;j){bspow(j,2);}printf("1*1...50*50%d\n",bs);for(int …

C语言 计算∑(k=1—100)k+∑(k=1—50)k²+∑(k=1—10)1/k的值

#include <stdio.h> int main(){int n1100,n250,n310;double k,s10,s20,s30;for(k1;k<n1;k){ //计算1—100的和s1s1k;}for(k1;k<n2;k){ //计算1—50的和s2s2k*k;}for(k1;k<n3;k){ //计算1-10的各倒数和s3s31/k;}printf("sum%6f",s1s2s3);return 0; }

c语言三种方法求n的k次方

// 方法一&#xff1a;递归 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int Power(int n,int k) //题目中有两个变量&#xff0c;在设计函数时需要两个形参 {if (k 0){return 1;}else if(k1) {return n;}else{return n*Power(…

K-Means算法的C语言实现

一、聚类和聚类算法 聚类&#xff0c;就是将数据对象划分成若干个类&#xff0c;在同一个类中的对象具有较高的相似度&#xff0c;而不同的类相似度较小。聚类算法将数据集合进行划分&#xff0c;分成彼此相互联系的若干类&#xff0c;以此实现对数据的深入分析和数据价值挖掘…

求单项链表的倒数第k个节点(c语言)

求单项链表的倒数第k个节点&#xff08;只遍历一次&#xff09; 单向链表求倒数第k个节点我们可以先遍历一遍找出链表的长度&#xff0c;再设置一个指针走&#xff08;n-k&#xff09;步可以找到倒数第k个节点。 但是&#xff0c;这需要遍历两次&#xff0c;如果只允许遍历一次…