c - Codechef 提交中出现段错误

标签 c

问题

给定 N 和 M,Dexter 想知道有多少对 a,b(1 <= a < b <=N) 使得 (a+b) 可被 M 整除。 例如,当N=4且M=3时,有2个可能的对,它们的和可被M整除,它们是(1,2)和(2,4)。 输入

第一行输入包含T(<=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);
  }
}

最佳答案

根据问题陈述,T可能达到100000。当T大于100时,以下陈述

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

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

由于每个测试用例都可以单独处理,因此您根本不需要 nm 数组:用标量变量 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);
    ...
}

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

关于c - Codechef 提交中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22844464/

相关文章:

c - C 中的外部链接

c - 为什么我收到 'Incompatible pointer type' 警告?

c - 在 C 中使用 icmp 实现 traceroute

c - 在 C 中区分文件名和命令行输入?

java - 从现有的 c 头文件和源代码生成 java 代码

c - 为什么 __attribute__((constructor)) 在静态库中不起作用?

c - K&R 1.19 练习 ("reverse"函数)

c - _builtin_prefetch()中第二个参数的作用是什么?

javascript - 使用javascript调用外部程序(例如: a C program)

c++ - 64 位 DLL 中的 CreateThread 不起作用