我一直试图在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;
}
答案 0 :(得分:0)
while(arr[i]!=l)
和while(arr[i]!=r)
错误。左侧和右侧的指示符Li
和Ri
是索引或计数,而不是数组中的值。您应该使用一个简单的for
循环:
for (i = l; i <= r; ++i)
pro = pro * arr[i-1] % m;
请注意,索引是i-1
,因为Li
和Ri
是使用基于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;