P1-2017级第一次算法上机 C 芸茹的入学测试

时间:2021-12-02 16:41:03

题目描述

芸如是一位天才科学家,为中国阵营效力。她有着出众的才智,在几年的军旅生活中,芸如研制了许多高科技武器,使得中国军队的武备可以与厄普西隆阵营狡猾的研究成果相抗衡,甚至还可以和整个盟军部队分庭抗礼。

芸如很小的时候就已经开始展现自己的才华,并作为最优秀的幼儿被送往保密培训学校。在她入校的第一天,校长决定亲自考一考这位被外界奉为"天才"的小姑娘。

校长的问题是这样的:

在一个长度为N的数字序列A,有Q组询问,每组询问给定lrlr,请求出A[l]+A[l+1]+...+A[r]的值。

由于这个结果可能很大,最终的结果要对10007取模(即取余数)。

输入

多组数据输入,数据组数不超过10

第一行是一个数字NQ,表示序列A中元素的个数和询问组数。(0<NQ≤1e6

第二行是N个整数,第i个整数A[i]表示序列A中的第i个元素,保证均为非负整数,且在INT范围内。

接下来Q行,每行是两个用空格分隔的整数lr(保证lr不会超出序列A下标的范围,且lr)。

注意序列A的下标从1开始。

输出

对于每组数据,每个询问输出一行,为和值。

输入样例

3 1

1 2 3

1 2

输出样例

3

特别说明

20%的数据,N,Q≤100

数据量较大,读入请勿用过慢读入方式。该类提示以后上机将不再出现,请大家多总结相关经验

思路

  本题需要用到前缀和的想法。不知道前缀和的同学请自行百度。

  本题为一个很简单的多次查询区间和问题,只要利用前缀和数组,在读入数据的时候利用一个sum数组对数字累次进行加和,在查询对应区间的和值的时候,进行sum数组的相减就可以了。

  本题需要特别注意的是取模问题。今后取模都请使用形如"(a+mod)%mod"的形式来代替"a%mod"。

参考代码 

 1 #include<stdio.h>
 2 #define MAXN 1000002
 3 #define Mod 10007
 4 int a[MAXN];
 5 int main()
 6 {
 7     int N,Q;//N:元素个数;Q:询问组数
 8     while(scanf("%d%d",&N,&Q) != EOF){
 9         int i;
10         //输入+前缀和数组预处理
11         a[0] = 0;
12         for(i = 1;i <= N;i++){
13             int tmp;
14             scanf("%d",&tmp);
15             tmp %= Mod;
16             a[i] = (tmp + a[i-1])%Mod;
17         }
18         //读入查询范围
19         for(i = 0;i < Q;i++){
20             int l,r;
21             scanf("%d%d",&l,&r);
22             printf("%d\n",(a[r]-a[l-1]+Mod)%Mod);
23         }
24     }
25 }