解题思路:
这是蓝桥杯2017年B组的最后一道编程题。
首先此题想到前缀和的思想,用前缀和数组的两项相减得到字串之和,能通过33%的数据,差不多是N<=1000左右时能通过。
其次如果想要100%通过,还要用优化的方法:取模得到的数来用组合数运算(任选两个余数一样的相减一定能被K整除)。
通过以上的优化以后,我们就少了枚举的操作,从二维降到一维上,时间复杂度从O(n^2)降到O(n)。
注意事项:
注意输入的范围,如果K=1的时候,会有10e10 个数据,超出int范围,这也是为什么我结果报出运行错误的原因。
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
typedef long long int ll;
int N,K;
ll ans=0;
int A[MAX];
vector<ll> S;
ll rec[MAX];
void slove()
{
S.clear();
for(int j=0;j<N;j++){
if(j==0) S.push_back(A[0]);
else S.push_back((S[j-1]+A[j]));
}
rec[0]++;
for(vector<ll>::iterator it=S.begin();it!=S.end();it++) rec[*(it)%K]++;
}
int main()
{
cin>>N>>K;
for(int i=0;i<N;i++) cin>>A[i];
slove();
for(int i=0;i<K;i++) ans+=rec[i]*(rec[i]-1)/2;
cout<<ans;
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复