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.

 

posted @ 2018-08-06 10:13  猪都哭了  阅读(190)  评论(0编辑  收藏  举报