bernoulli数
LL B[N][2],C[N][N],f[N][2]; int n,m; LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL lcm(LL a,LL b){return a/gcd(a,b)*b;} void getC(int n) { int i,j; n++; for(i=0;i<=n;i++)C[i][0]=C[i][i]=1; for(i=2;i<=n;i++){ for(j=1;j<n;j++){ C[i][j]=C[i-1][j-1]+C[i-1][j]; } } } void bernoulli(int n) { int i,m; LL s[2],b[2],l,g; B[0][0]=1;B[0][1]=1; for(m=1;m<=n;m++){ s[0]=1,s[1]=1; for(i=1;i<m;i++){ b[0]=C[m+1][i]*B[i][0]; b[1]=B[i][1]; l=lcm(s[1],b[1]); s[0]=l/s[1]*s[0]+l/b[1]*b[0]; s[1]=l; } s[0]=-s[0]; if(s[0]){ g=gcd(s[0],s[1]*C[m+1][m]); B[m][0]=s[0]/g; B[m][1]=s[1]*C[m+1][m]/g; } else B[m][0]=0,B[m][1]=1; } } main() int i,j; LL g,maxlcm; getC(20); bernoulli(20); while(~scanf("%d",&m)) { for(i=0;i<=m;i++){ g=gcd(C[m+1][i],B[i][1]); f[i][0]=C[m+1][i]/g*B[i][0]; f[i][1]=B[i][1]/g; } maxlcm=f[0][1]; for(i=1;i<=m;i++){ maxlcm=lcm(maxlcm,f[i][1]); } if(maxlcm<0)maxlcm=-maxlcm; for(i=0;i<=m;i++){ f[i][0]*=maxlcm/f[i][1]; } f[1][0]+=maxlcm*(m+1); printf("%I64d",(m+1)*maxlcm); for(i=0;i<=m;i++) printf(" %I64d",f[i][0]); printf(" 0\n"); }