1. 问题描述
  2.   给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
  3.  
  4.   你能求出数列中总共有多少个K倍区间吗?
  5. 输入格式
  6.   第一行包含两个整数NK。(1 <= N, K <= 100000)
  7.   以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
  8. 输出格式
  9.   输出一个整数,代表K倍区间的数目。
  10. 样例输入
  11. 5 2
  12. 1
  13. 2
  14. 3
  15. 4
  16. 5
  17. 样例输出
  18. 6
  19. 数据规模和约定
  20.   峰值内存消耗(含虚拟机) < 256M
  21.   CPU消耗 < 2000ms
  22.  
  23.   请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
  24.  
  25.   注意:
  26.   main函数需要返回0;
  27.   只使用ANSI C/ANSI C++ 标准;
  28.   不要调用依赖于编译环境或操作系统的特殊函数。
  29.   所有依赖的函数必须明确地在源文件中 #include <xxx>
  30.   不能通过工程设置而省略常用头文件。
  31.  
  32.   提交程序时,注意选择所期望的语言类型和编译器类型。

枚举所有区间和,然后一一判断是否可以整除K。

区间包含的元素可以有1/2/3/4……个,包含N个元素的区间和可以在包含N-1个元素的区间和的基础上加上元素N。

通过这样的反复迭代,可以求出所有的区间和。

可是OJ只给了25分,CPU和内存都超过了限制。

  1. import java.util.Scanner;
  2.  
  3. public class Main {
  4.  
  5. static int N;
  6. static int K;
  7. static int arr[];
  8. static int dp[][];
  9. static int result=0;
  10.  
  11. static boolean judge(int a){
  12. if(a%K==0){
  13. return true;
  14. }
  15. return false;
  16. }
  17.  
  18. public static void main(String[] args){
  19. Scanner reader=new Scanner(System.in);
  20. N=reader.nextInt();
  21. K=reader.nextInt();
  22. arr=new int[N+1];
  23. dp=new int[N+1][N+1];
  24. for(int i=1;i<=N;i++){
  25. arr[i]=reader.nextInt();
  26. dp[i][i]=arr[i];
  27. if(judge(dp[i][i])){
  28. result++;
  29. }
  30. }
  31. int count=1;
  32. while(count<=N-1){
  33. for(int i=1;i<=N-count;i++){
  34. dp[i][i+count]=dp[i][i+count-1]+arr[i+count];
  35. if(judge(dp[i][i+count])){
  36. result++;
  37. }
  38. }
  39. count++;
  40. }
  41. System.out.print(result);
  42. }
  43. }

参考了许多人的博客,思路大都一致。

求区间 [ i , j ] 的区间和,等于 [ 1 , j ] 的区间和减去 [ 1 , i-1 ]的区间和,用 sum[j]-sum[i-1] 来表示;

当区间和对K取模等于0即 ( sum[j]-sum[i-1] )%K= 0 (  化为sum[j]%K=sum[i-1] %K )  时此区间满足条件要求。

所以对每个sum[i],求其值时顺求其对K的取模,最后得到一模数列,方便计算。

得到模数列,需选取模数列中的相同模进行组合,但题目限制了时空复杂度,此行不可行。

以题目中的第一个测试用例为例,求得模数列为 1 1 0 0 1

手动组合体验一下组合过程:

首元素 1 本身组合不了

第二个 1 可以与前面一个 1 组合

第三个元素 0 本身组合不了

第四个元素 0 可以与第三个元素 0 组合

第五个元素 1 可以与前面两个1 组合两次。(可以看出只要迭代加上前面已经出现过的相同模即可,假如存在第六个元素 1 ,此时它前面有 3 个 模 1 ,它可以与他们3个一一组合,一共在3种情况,所以加上3即可)

注意:模为0的情况,其本身不需要和其他0进行组合,因为他们不用和其他模相等(相减),自己这个数列本身就满足K倍。

Accept 代码

  1. import java.util.Scanner;
  2.  
  3. public class Main {
  4.  
  5. static int N;
  6. static int K;
  7. static int sum[];
  8. static int mod[];
  9. static long result=0;
  10.  
  11. public static void main(String[] args){
  12. Scanner reader=new Scanner(System.in);
  13. N=reader.nextInt();
  14. K=reader.nextInt();
  15. sum=new int[N+1];
  16. mod=new int[K];
  17. for(int i=1;i<=N;i++){
  18. sum[i]=(sum[i-1]+reader.nextInt())%K; //再次得到一个模 sum[i]
  19. result+=mod[sum[i]]; //其与前面相同的模一一组合
  20. mod[sum[i]]++;
  21. }
  22. System.out.print(result+mod[0]);
  23. }
  24. }

K倍区间 蓝桥杯的更多相关文章

  1. 2017第八届蓝桥杯 K倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...

  2. 蓝桥杯试题 k倍区间(dp)

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

  3. 第八届蓝桥杯省赛 K倍区间

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

  4. k倍区间 前缀和【蓝桥杯2017 C/C++ B组】

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

  5. 蓝桥杯-k倍区间

    http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...

  6. [蓝桥杯2017初赛]k倍区间 前缀和

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

  7. Java实现蓝桥杯 历届试题 k倍区间

    历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...

  8. k倍区间:前缀和

    [蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...

  9. 【题集】k倍区间(抽屉原理)

    例1:http://lx.lanqiao.cn/problem.page?gpid=T444 蓝桥杯 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, A ...

随机推荐

  1. django No migrations to apply 问题解决

    最近在用django写项目,有的时候字段不够用,需要models增加字段,但是想回滚或者修改或者修改了属性等,例如忘了添加meta table于是操作了migrations 导致makemigrati ...

  2. 用嵌套List实现DataGrid的主从表显示

    //首先构造嵌套List,也就是一个list在另一个list中充当成员//如:referModels 在res中充当成员var res = totalAffectedMedels.Select(c = ...

  3. [Z]QPS、PV和需要部署机器数量计算公式

    QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计]QPS = 总请求数 / ( 进程总数 *   请求时间 )QPS ...

  4. 前端调试利器---nproxy

    前言:习惯了在windows环境中使用Fiddler的童鞋们,是不是感觉它的网络重定向功能很酷,Fiddler能按照你设置的规制捕获网络请求,再指向本地文件,如拦截你的js文件到本地,就能很快的调试线 ...

  5. 4.redis 键

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令 ...

  6. Django xadmin的使用 (三)

    关于报错: 1.在页面添加好新的用户后登录报错 解决方法: 新建一个app,名叫app D:\myfiles\study\python\django\datas>python manage.py ...

  7. **Python的函数参数传递 和 global

    函数的参数到底是传递的一份复制的值,还是对内存的引用? 我们看下面一段代码: a = [] def fun(x): x.append(1) fun(a) print(a) 想想一下:如果传递的是一份复 ...

  8. 如何去掉Myeclipse对JS等文件的验证

    或 MyEclipse->validation->Excluded Resource下找到不需要验证的文件或者文件夹 或 右键点击该项目-->MyEclipse-->Exclu ...

  9. Docker常用操作命令

    docker 常用管理命令 修改镜像地址 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ...

  10. flex 设置换行flex-wrap

    flex 设置flex-wrap 换行 本来预想的正常情况下,代码应该如下: ul { width: 100%; display: flex; flex-wrap: wrap; li { ; widt ...