ybtoj递推平铺方案

Posted conprour

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于ybtoj递推平铺方案的主要内容,如果未能解决你的问题,请参考以下文章

ybtoj 递推B. 2.求 f 函数

YbtOJ#20067糖果分配

ybtoj 状压DP课堂过关 例题1jzoj 1266 luogu P1879 [USACO06NOV]Corn Fields G & 玉米田 & 种植方案

矩阵的幂

矩阵的幂

YbtOJ#20075区间异或