问题
鉴于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);
}
}
答案 0 :(得分:3)
根据问题陈述,T
最多可达100000.当T
高于100时,以下陈述
scanf("%d %d",&n[i],&m[i]);
产生未定义的行为,因为n
和m
的大小均为100。
由于每个测试用例都可以单独处理,因此您根本不需要n
和m
数组:用标量变量m
和n
替换它们,删除第一个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);
...
}
注意:这将解决崩溃问题,但您需要努力将算法的速度提升到可接受的水平。