poj 2506 Tiling(高精度)
Description
Here is a sample tiling of a 2x17 rectangle.

Input
Output
Sample Input
2
8
12
100
200
Sample Output
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251 刚开始没推出来,还是看了Discuss才知道递推公式是:f[n]=f[n-1]+2*f[n-2],推论方法如下:
首先,无论任何一种方案,最左边的要么是一根竖的,要么是两根横的,要么是一个方的,对吧?所以:
当是一根竖时剩下的方案数是OPT[i-1]
当是两根横时剩下的方案数是OPT[i-2]
当是一个方时剩下的方案数是OPT[i-2]
故OPT[i]=OPT[i-1]+2*OPT[i-2]
转化为二阶齐次常系数线性方程为:
f(n-2)-f(n-1)-2f(n-2)=0
其特征方程是:
x^2-x-2=0
解得特征方程的根式:x=-1 或 x=2
故得
f(n)=a*(-1)^n+b*2^n
将f(0)=1,f(1)=1的值代入,解得f(n)=1/3*(-1)^n+2/3*2^n
可简化为:
if(n%2==0)
opt[n]=(2^(n+1)+1)/3
else
opt[n]=(2^(n+1)-1)/3
不要问我为什么,我也不知道。然后尝试着自己写,于是乎就把自己绕进去了,看了大神的代码才知道什么叫巧妙。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct pos
{
int a[];
int len;
} path[];
void c2(pos &x) //乘2操作
{
int len=x.len;
for(int i=; i<=len; i++)
x.a[i]*=;
for(int i=; i<=len; i++)
{
if(x.a[i]>)
{
x.a[i]-=;
x.a[i+]++;
}
}
if(x.a[len+]!=)
x.len++;
}
void add(pos &a,pos b,pos c)/*加操作*/
{
int Max=max(b.len,c.len);
for(int i=; i<=Max; i++)
a.a[i]=b.a[i]+c.a[i];
for(int i=; i<=Max; i++)
{
if(a.a[i]>)
{
a.a[i]-=;
a.a[i+]++;
}
}
if(a.a[Max+]!=)
a.len=Max+;
else
a.len=Max;
}
int main()
{
int n;
while(cin>>n)
{
memset(path,,sizeof(path));
path[].a[]=;
path[].a[]=;
path[].len=path[].len=;
for(int i=; i<=n; i++)
{
c2(path[i-]);
add(path[i],path[i-],path[i-]);
}
for(int i=path[n].len; i>=; i--)
cout<<path[n].a[i];
cout<<endl;
}
return ;
}
贴上一位大神的代码如下:
#include <iostream>
#define base 100000000
int a[][];
int main(int argc, char** argv) {
a[][]=a[][]=;
for(int i=;i<=;i++){
for(int j=;a[i-][j];j++){
a[i][j]+=a[i-][j]+*a[i-][j];
if(a[i][j]>=base){
a[i][j+]+=a[i][j]/base;
a[i][j]%=base;
}
}
}
int n;
while(~scanf("%d",&n)){
int j;
for(j=;a[n][j];j++);
j--;
printf("%d",a[n][j--]);
while(j>=)
printf("%08d",a[n][j--]);
printf("\n");
}
return ;
}
poj 2506 Tiling(高精度)的更多相关文章
- poj 2506 Tiling(递推 大数)
题目:http://poj.org/problem?id=2506 题解:f[n]=f[n-2]*2+f[n-1],主要是大数的相加; 以前做过了的 #include<stdio.h> # ...
- POJ 2506 Tiling(递推+大整数加法)
http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. #includ ...
- poj 2506 Tiling(java解法)
题目链接:id=2506">http://poj.org/problem?id=2506 本题用的java解的.由于涉及到大数问题,假设对java中的大数操作不熟悉请点这儿:链接 思路 ...
- poj 2506 Tiling 递推
题目链接: http://poj.org/problem?id=2506 题目描述: 有2*1和2*2两种瓷片,问铺成2*n的图形有多少种方法? 解题思路: 利用递推思想,2*n可以由2*(n-1)的 ...
- [ACM] POJ 2506 Tiling (递归,睑板)
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7487 Accepted: 3661 Descriptio ...
- POJ 2506 Tiling
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7437 Accepted: 3635 Descriptio ...
- POJ 2506 Tiling (递推 + 大数加法模拟 )
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7965 Accepted: 3866 Descriptio ...
- poj 2506 Tiling(大数+规律)
poj2506Tiling 此题规律:A[0]=1;A[1]=1;A[2]=3;--A[n]=A[n-1]+2*A[n-2];用大数来写,AC代码: #include<stdio.h> # ...
- POJ 2506 Tiling dp+大数 水题
大致题意:现有两种方块(1X2,2X2),方块数量无限制.问用这两种方块填满2Xn的矩阵的填法有多少种. 分析:通俗点说,找规律.专业化一点,动态规划. 状态d[i],表示宽度为i的填法个数. 状态转 ...
随机推荐
- ScrollView嵌套LinearLayout布局不能撑满全屏的问题
当ScrollView里的元素想填满ScrollView时,使用"fill_parent"或者"match_parent"是不管用的,必需为ScrollView ...
- Cloud Foundry v2 部署及入门运维
之前写过一个Guide for Cloud Foundry New Teamer.不过似乎已经有些过时,那会实验室主要是针对的CF v1进行的研究,现在已经全面进入V2时代了.所以更新一下关于Clou ...
- Linux下 MYSQL 主从复制、同步
mysql从3.23.15版本以后提供数据库复制功能.利用该功能可以实现两个数据库同步,主从模式(A->B),互相备份模式(A<=>B)的功能. 主从模式(A->B)的配置过程 ...
- background 和渐变 总结
一,background-position:(图片定位) 三种写法: 1):按%比,左上角最小(0%,0%),右下角最大(100%,%100): 2):(x,y)左上角最小(0,0),右下角最大(ma ...
- cookie session ORM 操作
. ORM增删改查操作 http://www.cnblogs.com/liwenzhou/p/8660826.html . 单表增删改查 . 单表的双下划线操作 . 外键的跨表查询 . 正向查询 . ...
- angular2.0学习笔记1.开发环境搭建 (node.js和npm的安装)
开发环境, 1.安装Node.js®和npm, node 6.9.x 和 npm 3.x.x 以上的版本. 更老的版本可能会出现错误,更新的版本则没问题. 控制台窗口中运行命令 node -v 和 n ...
- Maven 系列 一 :Maven 快速入门及简单使用
开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个项目管理工具,主要用于项目构建,依赖管理,项目信息管理. 2.下载及安装 下载最 ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- ORM学员管理系统单表查询示例
前期准备工作 首先创建好一个项目 一:必须使用MySQL创建一个库 因为ORM只能对表和数据进行处理,所以库必须自己创建 create database mysite; 二:进行相关的配置 在项目my ...
- System.Runtime.InteropServices.COMException: 检索 COM 类工厂中 CLSID 为 {0002E510-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80040154
这个问题困恼我好几天了,今天终于解决. 开始我在网上左百度右google,都没搜到最终的解决方案,今天我把解决方案贴出来,以供大家分享! 网上有些是报80070005错误的,跟我这个80040154错 ...