zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    iOS NSPredicate和正则表达式
    Linux下网络socket编程——实现服务器(select)与多个客户端通信
    多线程有什么用?
    一句话说明白什么是面向对象
    (转)简单的Malloc实现
    动态内存管理:malloc/free/new/delete/brk/mmap
    Qt绘制中国象棋棋盘
    (转)Qt中文手册 之 QApplication
    Qt常用类——QFrame类与QWidge类
    Qt常用类——QWidget
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9428787.html
Copyright © 2011-2022 走看看