记录编号 |
127720 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[金陵中学2007] 最优分解方案 |
最终得分 |
100 |
用户昵称 |
乌龙猹 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2014-10-16 07:34:28 |
内存使用 |
0.30 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
struct dx
{
int hs;
int hw;
int lk;
};
dx fr[1001];
int n,jl;
int a[101],b[101],c[201];
void change(int,int []);
void cf();
int main()
{
freopen("best.in", "r", stdin);
freopen("best.out", "w", stdout);
scanf("%d",&n);
fr[1].hs=1;fr[1].hw=4;fr[1].lk=1;
fr[2].hs=5;fr[2].hw=8;fr[2].lk=2;
int i=3;
while(1)
{
fr[i].hs=fr[i-1].hw+1;
fr[i].hw=fr[i].hs+i+1;
fr[i].lk=i;
if(fr[i].hw>=n)
{
jl=i;
break;
}
i++;
}
if(n<=8) jl=2;
if(n==fr[jl].hw)
{
a[0]=1;
a[1]=1;
for(int i=3;i<=jl+1;i++)
{
change(i,b);
cf();
}
change(jl+3,b);
cf();
for(int i=a[0];i>=1;i--) printf("%d",a[i]);
return 0;
}
int en=jl+2;
int bj=en-(n-fr[jl].hs);
a[0]=1;
a[1]=1;
for(int i=2;i<=en;i++)
{
if(i==bj) continue;
change(i,b);
cf();
}
for(int i=a[0];i>=1;i--) printf("%d",a[i]);
return 0;
}
void change(int x,int a[])
{
for(int i=0;i<=a[0];i++) a[i]=0;
while(x)
{
a[++a[0]]=x%10;
x/=10;
}
}
void cf()
{
int i,j,x=0;
for(i=1;i<=a[0];i++)
{
x=0;
for(j=1;j<=b[0];j++)
{
c[i+j-1]+=a[i]*b[j]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+b[0]]=x;
x=0;
}
i=a[0]+b[0];
while((c[i]==0)&&(i>1)) --i;
c[0]=i;
memset(a,0,sizeof(a));
for(int k=i;k>=0;--k) a[k]=c[k];
memset(c,0,sizeof(c));
}