高精度一次写对辣!开心!
然而公式推错,怒WA,感觉没救了…
给用Python的跪了…
AC code:
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=18010;
int n,m;
int cnt1[N],cnt2[N];
struct Big{
int l;
int a[N];
Big(){
l=0;
for(int i=0;i<N;i++) a[i]=0;
}
friend Big operator+(Big x,Big y){
Big z;
z.l=max(x.l,y.l);
for(int i=1;i<=z.l;i++){
z.a[i]+=x.a[i]+y.a[i];
z.a[i+1]+=z.a[i]/10;
z.a[i]%=10;
}
if(z.a[z.l+1]) z.l++;
return z;
}
friend Big operator*(int k,Big x){
Big y;
for(int i=1;k;i++){
y.l=i;
y.a[i]=k%10;
k/=10;
}
return x*y;
}
friend Big operator*(Big x,Big y){
Big z;
z.l=x.l+y.l-1;
for(int i=1;i<=x.l;i++){
for(int j=1;j<=y.l;j++) z.a[i+j-1]+=x.a[i]*y.a[j];
}
for(int i=2;i<=z.l+1;i++){
z.a[i]+=z.a[i-1]/10;
z.a[i-1]%=10;
}
if(z.a[z.l+1]) z.l++;
return z;
}
}A,C1,C2,ANS;
void print(Big x){
for(int i=x.l;i;i--) printf("%d",x.a[i]);
printf("\n");
}
int main(){
scanf("%d%d",&n,&m);
if(!(n|m)){
printf("0\n");
return 0;
}
A.l=A.a[1]=C1.l=C1.a[1]=C2.l=C2.a[1]=1;
for(int i=2;i<=m;i++) A=i*A;
for(int i=2;i<=n+1;i++) A=i*A;
for(int i=m+1;i<=n+3;i++){
for(int t=i,j=2;t!=1;j++){
while(!(t%j)){
cnt1[j]++;
t/=j;
}
}
}
for(int i=2;i<=n+3-m;i++){
for(int t=i,j=2;t!=1;j++){
while(!(t%j)){
cnt1[j]--;
t/=j;
}
}
}
for(int i=2;i<=n+3;i++){
while(cnt1[i]){
C1=i*C1;
cnt1[i]--;
}
}
for(int i=m;i<=n+2;i++){
for(int t=i,j=2;t!=1;j++){
while(!(t%j)){
cnt2[j]++;
t/=j;
}
}
}
for(int i=2;i<=n-m+3;i++){
for(int t=i,j=2;t!=1;j++){
while(!(t%j)){
cnt2[j]--;
t/=j;
}
}
}
for(int i=2;i<=n+2;i++){
while(cnt2[i]){
C2=i*C2;
cnt2[i]--;
}
}
ANS=n*A*C1+2*A*C2;
print(ANS);
return 0;
}