组合入门题。高精度入门题。
#include#include #include #include #include #include using namespace std;int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}#define N 1000010int n,m,a[N],len;void update(){ for (int j=1;j<=len;j++) a[j+1]+=a[j]/10,a[j]%=10; while (a[len+1]) len++,a[len+1]+=a[len]/10,a[len]%=10;}void mul(int i){ for (int j=1;j<=len;j++) a[j]*=i; update();}int main(){ n=read(),m=read(); if (m==0) { a[1]=1;len=1; for (int i=2;i<=n+1;i++) mul(i); mul(n); } else { a[1]=2*m+n*(n+3);update(); for (int i=2;i<=n+1;i++) mul(i); for (int i=n+2;i>n+3-m;i--) mul(i); } while (!a[len]&&len>1) len--; for (int i=len;i;i--) printf("%d",a[i]); return 0;}