JZOJ 4866 【NOIP2016提高A组集训第8场11.5】禅与园林艺术

来源:互联网 发布:windows系统维护工具 编辑:程序博客网 时间:2024/06/04 10:49

禅与园林艺术

题目大意

有一个长度为N的数列A,有M次询问,每次给出三个数L,RP
询问对于所有的L<=L<=R<=R
(AL+AL+1+...+AR) mod P的最小值。

数据范围

1<=N,M<=5*1041<=L<=R<=N1<=P<=1020<=Ai<=109

题解

这题看上去很难,其实想到的话就会觉得很简单。
定义前缀数组Sumi=A1+A2+...+Ai1+Ai
则题目就是让我们求对于每次询问L,R,P,对于所有的L-1<=L<=R<=R,(SumR-SumL) mod P的最小值。
R-(L-1)+1>=P,则说明必然存在某个LR,满足(SumR-SumL) mod P=0(该结论显然,请读者自行思考),此时答案为0
R-(L-1)+1<P,因为P最大不过102,因此此时可以直接暴力统计最小值求解即可。

Code(Pascal)

var    n,m,i,j,k:longint;    lj,l,r,p,ans:int64;    sum:array[0..60000] of int64;function min(a,b:int64):int64;    begin        if a<b then exit(a)        else exit(b);    end;begin    readln(n,m);    for i:=1 to n do    begin        read(lj);        sum[i]:=sum[i-1]+lj;    end;    for i:=1 to m do    begin        readln(l,r,p);        if r-l+2>p then writeln(0)        else        begin            ans:=p;            for j:=l-1 to r-1 do            for k:=j+1 to r do            ans:=min(ans,(sum[k]-sum[j]) mod p);            writeln(ans);        end;    end;end.
1 0