在线法官(CODECHEF)中的答案错误

时间:2019-08-20 19:57:21

标签: c

我一直试图在codechef上解决以下问题 https://www.codechef.com/problems/CHMOD

我原本以为是一个时限错误,但这给了我一个错误的答案。尽管我找到了一种解决时间限制的方法,但无法弄清楚这个错误答案的原因。

这是我的解决方法

#include <stdio.h>
#include <string.h>

int main(void) {
    int num,i;
    scanf("%d",&num);
    int arr[num];
    for(i=0;i<num;i++){
        scanf("%d",&arr[i]);
    }
    int testCases,l,r;
    long int m,pro=1;
    scanf("%d",&testCases);
    while(testCases--){
        pro=1;
        scanf("%d%d%ld",&l,&r,&m);
        i=0;
        while(arr[i]!=l){
            i++;
        }
        while(arr[i]!=r){
            pro=(pro*arr[i])%m;
            i++;
        }
        pro=(pro*arr[i])%m;
        printf("%d\n",pro);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

while(arr[i]!=l)while(arr[i]!=r)错误。左侧和右侧的指示符LiRi是索引或计数,而不是数组中的值。您应该使用一个简单的for循环:

for (i = l; i <= r; ++i)
    pro = pro * arr[i-1] % m;

请注意,索引是i-1,因为LiRi是使用基于1的索引给出的,但是C对其数组使用基于0的索引。

答案 1 :(得分:0)

由于使用C语言求解程序,因此必须意识到问题描述假定数组索引从1而不是0开始。因此,必须调整作为输入提供的左右段边界的值。只需从左边的值中减去1,然后在此处开始细分即可。当您的索引小于正确的值时,继续处理细分。 您对问题的理解有些缺陷。您需要将细分中的值全部相乘,然后采用乘积模。

请参见使用Ada的以下解决方案:

-----------------------------------------------------------------------
-- Code Chef CHMOD
-----------------------------------------------------------------------
with Ada.Text_IO; use Ada.Text_io;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Chmod is
   subtype Num_Items is Positive range 1..100_000;
   subtype Values is Integer range 1..100;
   type Data_Array is array(Num_Items range <>) of Values;
   Num_Elements : Num_Items;
begin
   Get(Num_Elements);
   declare
      Toy    : Data_Array(1..Num_Elements);
      Left   : Num_Items;
      Right  : Num_Items;
      Mi     : Positive;
      Games  : Num_Items;
      Result : Positive;
   begin
      for Num of Toy loop
         Get(Num);
      end loop;
      Get(Games);
      for I in 1..Games loop
         Result := 1;
         Get(Left);
         Get(Right);
         Get(Mi);
         for V in Left..Right loop
            Result := Result * Toy(V);
         end loop;
         Put(Item => Result mod Mi, Width => 1);
         New_Line;
      end loop;
   end;
end Chmod;