蓝桥杯 历届试题 K倍区间数(C语言)

举报
Fivecc 发表于 2022/08/06 00:13:36 2022/08/06
【摘要】 K倍区间数 问题描述    给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列 Ai, Ai+1, … Aj(i <= j)之和是K的倍数, 我们就称这个区间[i,...

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 2
1 2 3 4 5
样例输出
6
数据规模和约定

思路:要求的是k的区间 而且是任意起点都可以,也就是随便截取区间只要是K的倍数即可。
那这里我们肯定得做取余运算了,如果余数为0当然是k的倍数了 那么余数不为0就不是K的倍数,
但是 仔细想一想 两个区间对k的取余结果相同,比如余数都为1时,此时这两个区间相减之后的
区间就是K的倍数了,但然这里不用担心,因为每次取到的都是连续的区间,所以减出来的区间也是连续的。
这里用到了sum来存余数x对应这个有y个区间,对于每种不同的区间他们的数量就是C(n,2),
就是n个里取两个相减,当然这里有特殊,就是余数为0的情况需要额外加1 因为 比如说S5就是K的倍数,他不需要减什么区间,但是在我们的运算中是要取到两个区间,所以要额外加1 相当于加了个 和为0的区间S0

#include <stdio.h>
int main()
{
  long int i,n,k,j,s,s1;
  long long sum[100001],js[100001]={0};
  sum[0]=0;long long ans=0;
  scanf("%ld%ld",&n,&k);
  for(i=1;i<=n;i++)scanf("%ld",&s),sum[i]=sum[i-1]+s; 
   js[0]=1;
    for(j=1;j<=n;j++)js[sum[j]%k]++;
    for(i=0;i<k;i++)if(js[i])ans+=(js[i]*(js[i]-1))/2;//C(n,2) 从 众多区间里选两个 都可构成 
printf("%lld\n",ans); 
return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。

原文链接:fivecc.blog.csdn.net/article/details/79756235

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。