B4310 [蓝桥杯青少年组国赛 2024] 第五题
题目描述
给定包含 nnn 个整数的数列,从中选取一段连续子数列,使其元素之和能被 kkk 整除。
请找出符合要求的最长连续子数列并输出其长度以及子数列本身;如果符合要求的最长连续子数列有多个,则输出起始位置最靠后的那个子数列。如果不存在符合要求的子数列,则输出 −1-1−1。
例如:当 n=7n=7n=7,k=7k=7k=7,数列为 777、333、444、111、555、141414、999 时:
- 连续子数列 {7}\{7\}{7}、{7,3,4}\{7,3,4\}{7,3,4}、{3,4}\{3,4\}{3,4} 和 {5,14,9}\{5,14,9\}{5,14,9} 的和都能被 777 整除;
- 其中最长的连续子数列有 {7,3,4}\{7,3,4\}{7,3,4} 和 {5,14,9}\{5,14,9\}{5,14,9},起始位置最靠后的是 {5,14,9}\{5,14,9\}{5,14,9};
- 故符合要求的最长连续子数列长度为 333,子数列为 555 141414 999。
输入格式
- 第一行输入两个整数 nnn 和 kkk(1≤n≤1051 \leq n \leq 10^51≤n≤105,2≤k≤1082 \leq k \leq 10^82≤k≤108),整数之间以一个空格隔开;
- 第二行输入 nnn 个整数(1≤1 \leq1≤ 整数 ≤104\leq 10^4≤104),整数之间以一个空格隔开。
输出格式
如果存在符合要求的最长连续子数列,则输出为两行:
- 第一行输出一个整数,表示最长连续子数列的长度;
- 第二行输出若干个整数,表示起始位置最靠后的最长连续子数列,整数之间以一个空格隔开。
如果不存在符合要求的子数列,则输出 −1-1−1。
输入输出样例 #1
输入 #1
7 7
7 3 4 1 5 14 9
输出 #1
3
5 14 9
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[100001],dp[100001];
int start=0,endd=0,maxans=0;
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
dp[i]=dp[i-1]+a[i];
}
for(int i=n;i>=1;i--){//长度
for(int j=n;j>=i;j--){//终点
if((dp[j]-dp[j-i])%k==0){
cout<<i<<"\n";
for(int k=j-i+1;k<=j;k++){
cout<<a[k]<<' ';
}return 0;
}
}
}
if(maxans==0){
cout<<-1;
return 0;
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 B4310 蓝桥杯青少年组国赛 2024 第五题&spm=1001.2101.3001.5002&articleId=148348767&d=1&t=3&u=4bb6144c1c9c43a7a4c66eac09a63301)
6617

被折叠的 条评论
为什么被折叠?



