样例都过了,但评测老是显示在二十行左右出现不对的数,查不出错来了,救救孩子/kk
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#define int long long
using namespace std;
const int N=4e5+9;
const int mod=1004535809;
const int g[]={3,334845270};
int a[N],b[N];
int r[N];
int term=1,l;
int n,k,t;
//int inv[N];
int read()
{
int f=1,x=0;
char s=getchar();
while(s<'0'||s>'9')
{
if(s=='-')
f=-1;
s=getchar();
}
while(s>='0'&&s<='9')
{
x=((x<<1)+(x<<3)+(s^'0'))%mod;
s=getchar();
}
return f*x%mod;
}
int quick(int x,int p)
{
int ret=1;
while(p)
{
if(p&1) ret=ret*x%mod;
x=x*x%mod;
p>>=1;
}
return ret%mod;
}
void NTT(int *A,int type)
{
for(int i=0;i<term;i++)
if(i<r[i])
swap(A[i],A[r[i]]);
for(int mid=1;mid<term;mid<<=1)
{
int R=mid<<1;
int Wn=quick(g[type],(mod-1)/R);
for(int j=0;j<term;j+=R)
{
int w=1;
for(int k=0;k<mid;k++,w=w*Wn%mod)
{
int x=A[j+k]%mod;
int y=w*A[j+k+mid]%mod;
A[j+k]=(x+y)%mod;
A[j+k+mid]=(x-y+mod)%mod;
}
}
}
if(type==1)
{
int inv=quick(term,mod-2);
for(int i=0;i<term;i++)
A[i]=A[i]*inv%mod;
}
return;
}
void lowchar()
{
b[0]=1;
// inv[1]=1;
// for(int i=2;i<=n;i++)
// inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=1;i<=n;i++)
b[i]=(-b[i-1]*(k-i+1+mod)*quick(i,mod-2)+mod)%mod;
NTT(a,0);
NTT(b,0);
for(int i=0;i<term;i++)
a[i]=a[i]*b[i]%mod;
NTT(a,1);
for(int i=1;i<=n;i++)
printf("%lld ",a[i-1]);
}
void bigsum()
{
b[0]=1;
// inv[1]=1;
// for(int i=2;i<=n;i++)
// inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=1;i<=n;i++)
b[i]=b[i-1]*(k+i-1)*quick(i,mod-2)%mod;
NTT(a,0);
NTT(b,0);
for(int i=0;i<term;i++)
a[i]=a[i]*b[i]%mod;
NTT(a,1);
for(int i=1;i<=n;i++)
printf("%lld ",a[i-1]);
}
signed main()
{
n=read();
k=read();
t=read();
for(int i=1;i<=n;i++)
a[i-1]=read();
while(term<=2*n)
{
term<<=1;
l++;
}
for(int i=0;i<term;i++)
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
if(t==1) lowchar();
else bigsum();
return 0;
}