Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
168942 | A班陈旻霄 | 组合数的高精度算法 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 1358 | 2024-08-20 14:57:30 |
#include <bits/stdc++.h> using namespace std; struct big { int l,num[10000]; void read() { string s; cin>>s; l=s.size(); for(int i=0;i<l;i++) num[l-i]=s[i]-'0'; } void print() { for(int i=l;i>=1;i--) cout<<num[i]; } void conv(string s) { l=s.size(); for(int i=0;i<l;i++) num[l-i]=s[i]-'0'; } }; big operator+(big a,big b) { big c; c.l=max(a.l,b.l); int t=0; for(int i=1;i<=c.l;i++) { if(i<=a.l) t+=a.num[i]; if(i<=b.l) t+=b.num[i]; c.num[i]=t%10; t/=10; } if(t>0) c.num[++c.l]=t; return c; } big operator*(big a,big b) { big c; c.l=a.l+b.l-1; for(int i=1;i<=a.l;i++) for(int j=1;j<=b.l;j++) c.num[i+j-1]+=a.num[i]*b.num[j]; for(int i=1;i<c.l;i++) { c.num[i+1]+=c.num[i]/10; c.num[i]%=10; } while(c.num[c.l]>=10) { c.num[c.l+1]+=c.num[c.l]/10; c.num[c.l]%=10; c.l++; } return c; } big operator*(big a,int b) { big c; c.l=a.l; int t=0; for(int i=1;i<=c.l;i++) { t+=a.num[i]*b; c.num[i]=t%10; t/=10; } while(t>0) { c[++c.l]=t%10; t/=10; } return c; } big cmb(big a,big b) { big z; z.conv("0"); if(a==z) return z; if(b==z) return 1; big x=a,y=b,t=b; x.num[1]--,y.num[1]--; return cmb(x,t)+cmb(x,y); } int main() { big a,b; a.read(),b.read(); big c=cmb(a,b); c.print(); return 0; }