2018洛谷8月月赛第一题_U28036 Nagisa loves Tomoya
U28036 Nagisa loves Tomoya
题目描述:
可爱的古河渚得到了一个序列。她定义一次操作为将所有的ai变为ai+a(i mod n+1)
然后她会向你进行Q次询问,每次问你x,y意义为在第x次操作后位置y的元素是多少。
这个问题太简单了,我们的Nagisa轻易地就解决了这个问题。请问您能解决这个问题吗?
输入格式:
一个整数n,表示序列的长度。
接下来一行n个整数,表示这个序列。
接下来一行一个整数Q,表示询问次数
接下来Q行,每行两个整数x,y意义如题所示。
输出格式:
共Q行,每行一个整数表示询问的答案,请注意对998244353取膜。
题解:
找到翻x次每个数字被统计的次数的规律,即杨辉三角。
当k>n的时候,就拐回来,即第一项加上最后一项。
代码:
1 const 2 mo=998244353; 3 var 4 n,q:longint; 5 a,f:array [0..1000001] of int64; 6 x,y,ans,b:array [0..10001] of int64; 7 function min(o,p:longint):longint; 8 begin 9 if o<p then exit(o); 10 exit(p); 11 end; 12 13 procedure init; 14 var 15 i:longint; 16 begin 17 fillchar(ans,sizeof(ans),0); 18 fillchar(f,sizeof(f),0); 19 readln(n); 20 for i:=1 to n do 21 read(a[i]); 22 a[0]:=a[n]; 23 readln(q); 24 for i:=1 to q do 25 begin 26 readln(x[i],y[i]); 27 b[i]:=i; 28 end; 29 end; 30 31 procedure qsort(l,r:longint); 32 var 33 i,j,t,mid:longint; 34 begin 35 if l>r then exit; 36 i:=l; j:=r; 37 mid:=x[(l+r) div 2]; 38 repeat 39 while x[i]<mid do inc(i); 40 while x[j]>mid do dec(j); 41 if i<=j then 42 begin 43 t:=x[i]; x[i]:=x[j]; x[j]:=t; 44 t:=y[i]; y[i]:=y[j]; y[j]:=t; 45 t:=b[i]; b[i]:=b[j]; b[j]:=t; 46 inc(i); dec(j); 47 end; 48 until i>j; 49 qsort(i,r); 50 qsort(l,j); 51 end; 52 53 procedure main; 54 var 55 i,j,k,t:longint; 56 begin 57 f[0]:=1; 58 i:=1; k:=0; 59 while i<=q do 60 begin 61 while x[i]=k do 62 begin 63 for j:=0 to min(k,n-1) do 64 ans[b[i]]:=(ans[b[i]]+f[j]*a[(y[i]+j) mod n]) mod mo; 65 inc(i); 66 end; 67 while k<x[i] do 68 begin 69 t:=f[n-1]; 70 for j:=min(n,k) downto 1 do 71 f[j]:=(f[j]+f[j-1]) mod mo; 72 f[0]:=(f[0]+t) mod mo; 73 inc(k); f[k]:=1; 74 end; 75 end; 76 end; 77 78 procedure print; 79 var 80 i:longint; 81 begin 82 for i:=1 to q do 83 writeln(ans[i]); 84 end; 85 86 begin 87 init; 88 qsort(1,q); 89 main; 90 print; 91 end.