Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9225 | Accepted: 4385 |
Description
In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?
Here is a sample tiling of a 2x17 rectangle.
Here is a sample tiling of a 2x17 rectangle.
Input
Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.
Output
For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.
Sample Input
2 8 12 100 200
Sample Output
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub BigInteger a,b,c,d; a = new BigInteger("1"); b = new BigInteger("3"); c = new BigInteger("5"); //System.out.println(k[3]); @SuppressWarnings("resource") Scanner cin = new Scanner(System.in); while(cin.hasNext()) { a = new BigInteger("1"); b = new BigInteger("3"); c = new BigInteger("5"); int n; n=cin.nextInt(); if(n==0){ System.out.println(1);} else if(n==1){System.out.println(a); } else if(n==2){System.out.println(b); } else if(n==3){System.out.println(c); } else { int i; for(i=4;i<=n;i++) { d=b.add(b); d=c.add(d); b=c; c=d; } System.out.println(c); } } } }
//c++
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;
char mp[300][1000];
void add(char a[],char b[],int x)
{
char res[1500],res1[1500];
int top=0;
int carry=0;
int t=0;
int la=strlen(a)-1;
int lb=strlen(b)-1;
while(la>=0 || lb>=0)
{
int aa=la>=0?a[la--]-'0':0;
int bb=lb>=0?b[lb--]-'0':0;
t=carry+aa+bb;
carry=t/10;
t=t%10;
char c=t+'0';
res[top++]=c;
}
while(carry)
{
t=carry/10;
carry%=10;
char c=carry+'0';
res[top++]=c;
carry=t;
}
int j=0;
for(int i=top-1;i>=0;i--)
mp[x][j++]=res[i];
mp[x][j]='\0';
}
int main()
{
int n;
strcpy(mp[0],"1");strcpy(mp[1],"1");strcpy(mp[2],"3");strcpy(mp[3],"5");
for(int i=4;i<=250;i++)
{
add(mp[i-1],mp[i],i);
add(mp[i-2],mp[i],i);
add(mp[i-2],mp[i],i);
}
while(~scanf("%d",&n))
{
cout<<mp[n]<<endl;
}
return 0;
}