大数 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;
}
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

