解题思路:

这是蓝桥杯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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论