洛谷月赛2018.8 T1题解(U28036 Nagisa loves Tomoya)

 

【题解】  

  我们设原来的数组为a1,a2,a3...,

  那么一次操作之后的数组变为a1+a2,a2+a3,a3+a4...,

  两次操作之后数组变为a1+2a2+a3,a2+2a3+a4,a3+2a4+a5...,

  三次操作之后数组变为a1+3a2+3a3+a4,a2+3a3+3a4+a5...,

  有没有发现什么?(n-1)次操作之后x位置的值就是ax,ax+1,ax+2,...,ax+n-1乘上各自的系数再相加,而系数就是杨辉三角的第n行

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define LL unsigned long long
 5 #define Mod 998244353
 6 #define N 3000010
 7 #define M 2010
 8 #define rg register
 9 using namespace std;
10 LL n,m,a[N],f[M][M];
11 inline int read(){
12     int k=0,f=1; char c=getchar();
13     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
14     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
15     return k*f;
16 }
17 int main(){
18     n=read();
19     for(rg int i=1;i<=n;i++) a[i]=a[i+n]=read()%Mod;
20     f[1][1]=1;
21     for(rg int i=2;i<=M-5;i++)
22         for(rg int j=1;j<=i;j++) f[i][j]=(f[i-1][j]+f[i-1][j-1])%Mod;
23     m=read();
24     while(m--){
25         int x=read()+1,y=read(); LL ans=0;
26         for(rg int i=y;i<=y+x-1;i++){
27             int k=i-y+1;
28             ans+=a[(i-1)%n+1]*f[x][k]%Mod; ans%=Mod;
29         }
30         printf("%lld\n",ans%Mod);
31     }
32     return 0;
33 }
View Code

 

posted @ 2018-08-03 16:20  Driver_Lao  阅读(351)  评论(0编辑  收藏  举报