【ybtoj】【递推】平铺方案
题意
题解
非常水的小递推,转移十分显然。
唯一特殊的就是要用高精,很久没写了,贴个模板上来纪念一下。
如果有时间再把压位高精补了。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c>='0'&&c<='9')) ch=c,c=getchar();
while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int n;
struct haa
{
int a[1005],len=1;
haa(){}
haa(int x)
{
memset(a,0,sizeof(a));len=1;
while(x){a[len++]=x%10;x/=10;} len--;
}
}f[255];
haa operator + (const haa &a,const haa &b)//高精加高精
{
haa ret=0;ret.len=max(a.len,b.len)+1;
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]+=a.a[i]+b.a[i]+up;
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
haa operator * (const haa &a,const int b)//高精乘低精
{
haa ret=0;ret.len=a.len+1;
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]=a.a[i]*b+up;
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
int main()
{
f[1]=1,f[2]=3;
n=250;
for(int i=3;i<=n;i++) f[i]=f[i-2]*2+f[i-1];
int k;
while(scanf("%d",&k)!=EOF)
{
for(int i=f[k].len;i>=1;i--)
printf("%d",f[k].a[i]);
printf("\n");
}
return 0;
}