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
数据规模和约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。 提交程序时,注意选择所期望的语言类型和编译器类型。
枚举所有区间和,然后一一判断是否可以整除K。
区间包含的元素可以有1/2/3/4……个,包含N个元素的区间和可以在包含N-1个元素的区间和的基础上加上元素N。
通过这样的反复迭代,可以求出所有的区间和。
可是OJ只给了25分,CPU和内存都超过了限制。
import java.util.Scanner; public class Main { static int N;
static int K;
static int arr[];
static int dp[][];
static int result=0; static boolean judge(int a){
if(a%K==0){
return true;
}
return false;
} public static void main(String[] args){
Scanner reader=new Scanner(System.in);
N=reader.nextInt();
K=reader.nextInt();
arr=new int[N+1];
dp=new int[N+1][N+1];
for(int i=1;i<=N;i++){
arr[i]=reader.nextInt();
dp[i][i]=arr[i];
if(judge(dp[i][i])){
result++;
}
}
int count=1;
while(count<=N-1){
for(int i=1;i<=N-count;i++){
dp[i][i+count]=dp[i][i+count-1]+arr[i+count];
if(judge(dp[i][i+count])){
result++;
}
}
count++;
}
System.out.print(result);
}
}
参考了许多人的博客,思路大都一致。
求区间 [ 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 代码
import java.util.Scanner; public class Main { static int N;
static int K;
static int sum[];
static int mod[];
static long result=0; public static void main(String[] args){
Scanner reader=new Scanner(System.in);
N=reader.nextInt();
K=reader.nextInt();
sum=new int[N+1];
mod=new int[K];
for(int i=1;i<=N;i++){
sum[i]=(sum[i-1]+reader.nextInt())%K; //再次得到一个模 sum[i]
result+=mod[sum[i]]; //其与前面相同的模一一组合
mod[sum[i]]++;
}
System.out.print(result+mod[0]);
}
}
K倍区间 蓝桥杯的更多相关文章
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯试题 k倍区间(dp)
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 第八届蓝桥杯省赛 K倍区间
问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- k倍区间 前缀和【蓝桥杯2017 C/C++ B组】
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- [蓝桥杯2017初赛]k倍区间 前缀和
题目描述 给定一个长度为N的数列,A1, A2, ... AN. 如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- Java实现蓝桥杯 历届试题 k倍区间
历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
- 【题集】k倍区间(抽屉原理)
例1:http://lx.lanqiao.cn/problem.page?gpid=T444 蓝桥杯 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, A ...
随机推荐
- python写个Hack Scan
前言: 之前逛SAFEING极客社区的时候 发现一款黑市卖2000多的软件,后面下载了 打不开.发现config文件里面有些不错的东西.总结了一下 有了以下的脚本. 脚本用处: [1]探测CMS(不敢 ...
- CodeSmith介绍和常见问题解决方案
一.CodeSmith介绍 CodeSmith模板代码生成实战详解 https://www.cnblogs.com/knowledgesea/p/5016077.html 二.CodeSmith连接 ...
- Redis实战——Redis的pub/Sub(订阅与发布)在java中的实现
借鉴:https://blog.csdn.net/canot/article/details/51938955 1.什么是pub/sub Pub/Sub功能(means Publish, Subscr ...
- poi操作word 2007 常用方法总结
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
- idea使用jrebel热部署插件
首先通过idea下载JReble插件 访问http://idea.lanyus.com/网站 跟着弹出框的步骤走就可以实现了: 在idea中使用tomcat部署项目 不要使用war:使用下面的文件
- iOS学习之WebView的使用
1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewControlle ...
- System.Web.Mvc.Html 命名空间小计
1,Html.Action 使用指定参数调用指定子操作方法并以 HTML 字符串形式返回结果. 1 <div id="HtmlAction"> 2 3 @Html ...
- C#匿名类型 - Anonymous Types
[C#匿名类型 - Anonymous Types] Anonymous types provide a convenient way to encapsulate a set of read-onl ...
- Python基础:面向对象基础(二) 继承
子类在继承的时候,在定义类时,小括号()中为父类的名字,父类的属性.方法,会被继承给子类,Python中允许多继承. 多继承 # 父类 Master class Master(object): def ...
- Opencv Shi-Tomasi角点检测
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...