大数 Astar-Round1 Problem B
发布时间:2021-03-13 21:12:41 所属栏目:大数据 来源:网络整理
导读:标题 2016"百度之星" - 资格赛(Astar Round1) http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=690pid=1002 Problem Description 度熊眼前有一个满是由1组成的字符串,被称为全1序列。你可以归并恣意相邻的两个1,从而形成一个新的序列
标题 2016"百度之星" - 资格赛(Astar Round1) http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=690&pid=1002 Problem Description 度熊眼前有一个满是由1组成的字符串,被称为全1序列。你可以归并恣意相邻的两个1,从而形成一个新的序列。对付给定的一个全1序列,请计较按照以上要领,可以组成几多种差异的序列。Input 这里包罗多组测试数据,每组测试数据包括一个正整数N,代表全1序列的长度。 1≤N≤200 Output 对付每组测试数据,输出一个整数,代表由标题中所给定的全1序列所能形成的新序列的数目。 Sample Input 1 3 5 Sample Output 1 3 8 Hint 假如序列是:(111)。可以结构出如下三个新序列:(111),(21),(12)。 说明 n-i个位置中安排i个2。要计较组合,因为N较大,最后功效远超long long能存储范畴,以是涉及大数加法、乘法、除法。 (这个代码运行时刻相对较长,不是很有参考性) (角逐还没竣事,但这篇文章能被搜刮引擎收录时应该竣事了吧) 代码 #include <iostream> using namespace std; const int SZ=50; int ans[SZ]; int c[SZ]; void mul(int a[],int m) { for(int i=0;i<SZ-2;i++){ a[i]*=m; } for(int i=1;i<SZ-2;i++){ a[i]+=a[i-1]/10; a[i-1]%=10; } } void div(int a[],int m) { int i,c; for(i=SZ-2,c=0;i>=0;i--){ c=c*10+a[i]; a[i]=c/m; c%=m; } } void add(int a[],const int b[]) { int i; for(i=0;i<SZ-2;i++){ a[i]+=b[i]; a[i+1]+=a[i]/10; a[i]%=10; } if(a[SZ-1]) cout<<"spill"<<endl; } void zero(int a[]) { for(int i=0;i<SZ;i++) a[i]=0; } void print(int a[]) { int i,j; for(i=SZ-1;i>=0;i--) if(a[i]) break; for(j=i;j>=0;j--) cout<<a[j]; cout<<endl; } int main() { int i,j; int n; while(cin>>n){ zero(ans); ans[0]=1; for(i=1;2*i<=n;i++){ zero(c); c[0]=1; for(j=1;j<=min(i,n-2*i);j++){ mul(c,n-i-j+1); div(c,j); } add(ans,c); } print(ans); } return 0; } (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |