HDU5875

Function

Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 399    Accepted Submission(s): 151


Problem Description

The shorter, the simpler. With this problem, you should be convinced of this truth.
  
  You are given an array  A of N postive integers, and M queries in the form (l,r). A function F(l,r) (1lrN) is defined as:
F(l,r)={AlF(l,r1) modArl=r;l<r.
You job is to calculate F(l,r), for each query (l,r).
 

 

Input

There are multiple test cases.
  
  The first line of input contains a integer  T, indicating number of test cases, and T test cases follow. 
  
  For each test case, the first line contains an integer N(1N100000).
  The second line contains N space-separated positive integers: A1,,AN (0Ai109).
  The third line contains an integer M denoting the number of queries. 
  The following M lines each contain two integers l,r (1lrN), representing a query.
 

 

Output

For each query (l,r), output F(l,r) on one line.
 

 

Sample Input

1
3
2 3 3
1
1 3
 

 

Sample Output

2
 

Source

 
 1 //2016.9.11
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #define N 100005
 6 
 7 using namespace std;
 8 
 9 int a[N], nex[N];//nex数组,表示跳到下一个要取余的位置,比a[i]大的数不用取余,此处优化降低时间
10 
11 int main()
12 {
13     int T, n, q, ans;
14     scanf("%d", &T);
15     while(T--)
16     {
17         scanf("%d", &n);
18         for(int i = 1; i <= n; i++)
19         {
20             scanf("%d", &a[i]);
21         }
22         scanf("%d", &q);
23         int l, r;
24         for(int i = 1; i <= n; i++)
25         {
26             nex[i] = -1;
27             for(int j = i+1; j <= n; j++)
28                 if(a[i]>=a[j])
29                 {
30                     nex[i] = j;
31                     break;
32                 }
33         }
34         while(q--)
35         {
36             scanf("%d%d", &l, &r);
37             ans = a[l];
38             for(int i = nex[l]; i <= r; i = nex[i])
39             {
40                 if(i == -1)break;
41                 ans %= a[i];
42             }
43             printf("%d\n", ans);
44         }
45     }
46 
47     return 0;
48 }

 

转载于:https://www.cnblogs.com/Penn000/p/5861361.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值