• 10.23T1 杨辉三角


    #3846 陷阱

    描述

    Jerryzhong 被 ljr 狠狠地嘲讽了一番,于是他想搞点事情。他制作了 n 个陷阱,每个陷阱的伤害值为 s[i],这 n 个陷阱十分神奇,它们的伤害值能不断提高,由于不可抗力的原因,Jerryzhong 制作这 n 个陷阱时将它们连在了一起,所以它们是有序且伤害值是一起提升的。

    Jerryzhong 总共能使陷阱提高 x 次伤害,他想知道提高伤害 x 次后陷阱 y 的伤害值 s[y],由于 Jerryzhong 不会数数而且忙着追番,因此他将这个问题交给了身为 dalao 的你。

    每提高一次伤害:将所有陷阱的伤害值 s[i]变为 s[i]+s[i%n+1]。

    例如陷阱 1 7 4,提高一次伤害后变为 8 11 5,再提高一次伤害后变为 19 16 13

    输入

    第一行包含一个整数 n 表示陷阱个数。

    接下来一行 n 个整数表示这 n 个陷阱的伤害值。

    接下来一行一个整数 q 表示询问次数。

    接下来 q 行,每行两个整数 x,y 意义如题所述

    输出

    如果你能做到则输出 yes,否则输出 no。

    输出一共 q 行,表示每次询问的答案,由于答案可能很大,请对 998244353 取模。

    样例输入[复制]
    5
    1 2 3 4 5
    2
    1 2
    2 2
    样例输出[复制]
    5
    12
    提示

    对于 30% 的数据,1<=n,x,q<=100。

    对于 50% 的数据,1<=n<=100000,1<=x<=500,1<=q<=100。

    对于 100% 的数据,1<=n<=1000000,1<=ai<=1e9,1<=x<=2000,1<=q<=10000。

    标签
    ZYH
     
     
     
    我们推一下显然发现系数是满足杨辉三角的,如果x超出n怎么办?超出部分循环加上前面的数就可以了
    例如1 3 3 1超出3个,那么把最后一个1加在第一个上面就可以了,变成2 3 3
    (此代码打的分段)
    code:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #define N 1000006
     5 using namespace std;
     6 const long long mod=998244353;
     7 long long read() {
     8     long long x=0,f=1;
     9     char c=getchar();
    10     while(!isdigit(c)) {
    11         if(c=='-')f=-1;
    12         c=getchar();
    13     }
    14     while(isdigit(c)) {
    15         x=(x<<3)+(x<<1)+c-'0';
    16         c=getchar();
    17     }
    18     return x*f;
    19 }
    20 long long n,sum;
    21 long long a[N][2],b[N],fac[N],inv[N];
    22 long long ksm(long long a,long long b) {
    23     long long ans=1;
    24     for(; b; b>>=1) {
    25         if(b&1) {
    26             ans*=a;
    27             ans%=mod;
    28         }
    29         a*=a;
    30         a%=mod;
    31     }
    32     return ans;
    33 }
    34 void pre() {
    35     fac[0]=1;
    36     for(long long i=1; i<=5000; i++)fac[i]=(fac[i-1]*i)%mod;
    37     inv[5000]=ksm(fac[5000],mod-2);
    38     for(long long i=4999; i>=0; i--)inv[i]=(inv[i+1]*(i+1))%mod;
    39 }
    40 long long C(long long m,long long n) {
    41     return ((fac[m]*inv[n]%mod)*inv[m-n])%mod;
    42 }
    43 int c[N];
    44 int main() {
    45     freopen("trap.in","r",stdin);
    46     freopen("trap.out","w",stdout);
    47     n=read();
    48     for(long long i=1; i<=n; i++)a[i][0]=read(),sum+=a[i][0];
    49     long long q;
    50     pre();
    51     q=read();
    52     for(long long i=1; i<=n; i++)b[i]=a[i][0];
    53     if(n<=100) {
    54         long long now=0;
    55         while(q--) {
    56             long long x,y;
    57             x=read(),y=read();
    58             now=0;
    59             for(long long i=1; i<=x; i++) {
    60                 for(long long j=1; j<=n; j++) {
    61                     a[j][now^1]=a[j][now]+a[j%n+1][now];
    62                     a[j][now^1]%=mod;
    63                 }
    64                 now^=1;
    65             }
    66             cout<<a[y][now]<<'
    ';
    67             for(long long i=1; i<=n; i++)a[i][0]=b[i];
    68         }
    69         return 0;
    70     }
    71     //cout<<C(5,1)<<"---";
    72     while(q--) {
    73         int x,y;
    74         x=read(),y=read();
    75         long long ans=0;
    76         for(int i=0; i<=x; i++) {
    77             ans+=(C(x,i)*b[(y+i-1)%n+1])%mod;
    78             ans%=mod;
    79         }
    80         cout<<ans<<'
    ';
    81     }
    82     return 0;
    83 }

    over

     
  • 相关阅读:
    各种协议与HTTP协议之间的关系
    在浏览器中输入url地址到显示主页的过程
    TCP 协议如何保证可靠传输
    TCP,UDP 协议的区别
    TCP 三次握手和四次挥手
    OSI与TCP/IP各层的结构与功能,用到的协议
    424. 替换后的最长重复字符
    webstorm快捷键
    S1:动态方法调用:call & apply
    S1:原型继承
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9838284.html
Copyright © 2020-2023  润新知