codechef提交中的分段错误

时间:2014-04-03 17:11:00

标签: c

问题

鉴于N和M Dexter想知道有多少对a,b(1 <= a

第一行输入包含T(&lt; = 100000),这是测试用例的数量。接下来的T行中的每一行包含两个整数N(1 <= N <= 10 ^ 9)和M(2 <= M <= 10 ^ 9)。 输出

每个测试用例输出一行,如前所述,对数(a,b)。

这是codechef的问题。提交答案后我得到了分段错误错误。请帮我解答正确答案。

#include<stdio.h>
#include<stdlib.h>

int main()
{
  int i,t,flag,j,x,k,m[100],n[100];
  scanf("%d",&t);
  for(i=1;i<=t;i++)
    scanf("%d %d",&n[i],&m[i]);

  for(x=1;x<=t;x++){
    k=1;
    flag=0;

    for(i=m[x];i<=((2*n[x])-1);i=(m[x]*k)){
      for(j=1;j<=(i/2);j++){
        if(((i-j)<=n[x]) && (j!=(i-j))){
          flag=flag+1;
        }
      }
      k++;
    }
    printf("%d\n",flag);
  }
}

1 个答案:

答案 0 :(得分:3)

根据问题陈述,T最多可达100000.当T高于100时,以下陈述

scanf("%d %d",&n[i],&m[i]);

产生未定义的行为,因为nm的大小均为100。

由于每个测试用例都可以单独处理,因此您根本不需要nm数组:用标量变量mn替换它们,删除第一个for循环,并在第二个循环中调用scanf

int i,t,flag,j,x,k,m,n;
scanf("%d",&t);
for(x=1;x<=t;x++) {
    scanf("%d %d", &n, &m);
    ...
}

注意:这将解决崩溃问题,但您需要努力将算法的速度提升到可接受的水平。