洛谷月赛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 }