求助帖!

suuannnn 2020-09-16 09:02:43
蓝桥杯k倍空间的题目。以下是我的代码:(一直得分都是28,是哪里出了问题?)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N,k,a[100001],i,s[100001],max=100000,flag[100001]={0};
scanf("%d%d",&N,&k);
int sum=0,count=0;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
s[i]=sum%k;
flag[s[i]]++;
if(max<s[i]) max=s[i];
}
for(i=0;i<=max;i++)
{
if(i==0) count+=flag[i]+flag[i]*(flag[i]-1)/2;
else count+=flag[i]*(flag[i]-1)/2;
}
printf("%d",count);
return 0;
}


这个一直测试不通过,我想知道原因是什么。
...全文
264 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
suuannnn 2020-09-20
  • 打赏
  • 举报
回复
flag数组的值都不是很大,应该不会超过int.但我试了一下用longlong int也还是不行。 现在这个为什么还不对啊菜鸡求教
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int N,k,i,max=100000,flag[100001]={0};
    scanf("%d%d",&N,&k);
    int sum=0,count=0;
    int *a = (int*)malloc(sizeof(int)*N);
    int *s=(int*)malloc(sizeof(int)*N);
    for(i=0;i<N;i++)
       {
           scanf("%d",&a[i]);
           sum+=a[i];
           s[i]=sum%k;
           if(max<s[i]) max=s[i];
       }
    free(a);
    for(i=0;i<N;i++) flag[s[i]]++;
    free(s);
    for(i=0;i<=max;i++)
    {
        if(i==0)  count+=flag[i]+flag[i]*(flag[i]-1)/2;
        else count+=flag[i]*(flag[i]-1)/2;
    }
    printf("%d",count);
    return 0;
}

suuannnn 2020-09-20
  • 打赏
  • 举报
回复
问题描述   给定一个长度为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
lin5161678 2020-09-16
  • 打赏
  • 举报
回复
题目呢? 为了回答你的问题 难道还得去参赛?
qybao 2020-09-16
  • 打赏
  • 举报
回复
原题是什么? 看你的代码,flag相乘(和阶乘有一拼),估计结果超出int范围了
自信男孩 2020-09-16
  • 打赏
  • 举报
回复
a[100001],i,s[100001],max=100000,flag[100001]={0};

栈上的空间没那么多,楼主这一下子定义了4个数组,并且每个数组都这么大,建议楼主用动态申请空间malloc/free。

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧