K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)

K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)_第1张图片K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)_第2张图片 

看到这道题首先就想到不停地遍历,找到符合条件的就可以计数

#include 
using namespace std;

int N;
int a[100000];
int K;
int ans;
int main()
{
	cin>>N>>K;
	for(int i=0;i>a[i];
	}
	for(int i=0;i

 当然,通过分析,两层for循环时间复杂度为O(n*n),运行超时

K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)_第3张图片

所以,只能想办法找到更好的办法

 K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)_第4张图片

 正确代码:(用到排列组合知识)

#include 
using namespace std;
long long mod[100010]={0},add[100010]={0};
long long sum=0,a[100010];
int main()
{
	int n,k;
	long long cnt=0;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	
	}
	for(int i=1;i<=n;i++)
	{
		sum=sum+a[i];
		mod[i]=sum%k;
		add[mod[i]]++;
	}
	for(int i=0;i

你可能感兴趣的:(蓝桥杯,c++)