HDOJ/HDU 1865 1sting(斐波拉契+大数~)

Problem Description
You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave the ‘1’ there. Surly, you may get many different results. For example, given 1111 , you can get 1111, 121, 112,211,22. Now, your work is to find the total number of result you can get.

Input
The first line is a number n refers to the number of test cases. Then n lines follows, each line has a string made up of ‘1’ . The maximum length of the sequence is 200.

Output
The output contain n lines, each line output the number of result you can get .

Sample Input
3
1
11
11111

Sample Output
1
2
8

题意:
若干个1,可以选择相邻两个合并成2。问有多少种可能的结果。

分析:递推加大数~

递推公式为db[i] = db[i-1] + db[i-2],斐波那契数列。
怎么推导出来的呢~~~我能说我是看出来的麽~

设有n个1,可以构成f(n)种。则加一个1的时候,前面n种仍然成立 f(n+1)=f(n)+*;
第n+1个1和第n个1相加构成2,前面n-1个1可以组合的个数。 f(n+1)=f(n)+f(n-1);

大数~用java很好过的~c的话,只能用数组模拟了。

import java.math.BigInteger;
import java.util.Scanner;

public class Main{

    static BigInteger db[] = new BigInteger[201];
    public static void main(String[] args) {
        dabiao();
        Scanner sc = new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0){
            String str =sc.next();
            int n =str.length();
            System.out.println(db[n]);
        }
    }
    private static void dabiao() {
        db[1]=new BigInteger("1");
        db[2]=new BigInteger("2");
        for(int i=3;i<db.length;i++){
            db[i]=db[i-1].add(db[i-2]);
        }
    }
}
时间: 2024-09-30 17:03:57

HDOJ/HDU 1865 1sting(斐波拉契+大数~)的相关文章

HDOJ/HDU 5686 Problem B(斐波拉契+大数~)

Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列. Input 这里包括多组测试数据,每组测试数据包含一个正整数N,代表全1序列的长度. 1≤N≤200 Output 对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量. Sample Input 1 3 5 Sample Output 1 3 8 Hin

循环体-求斐波拉契的第n项的值,迭代实现

问题描述 求斐波拉契的第n项的值,迭代实现 实现代码如下(利用迭代): long diedai(int n) { long result; long p_result; long n_result; result=p_result=1; //这一段表达的斐波拉契数列第n项的值 while(n>2) { n-=1; n_result=p_result;//把前一项的值赋给前一项的前一项 p_result=result; // result=p_result+n_result;//结果等于前一项加上

利用Redis缓存提高斐波拉契数列程序的性能例子

去某家公司面试,PHP岗位,先做笔试,再两轮面试,最后hr面,拿了offer.   笔试题都不难,做完随手拍了一张,然后回去把这道求斐波那契数列的题在电脑上运行了一遍,写的当然是对的,但是当你要求第N位,当N大于60的时候就会非常慢了,后来就想着用Redis缓存来优化性能,效果非常惊人!     我把题目改了一下,也是要用递归,但是是要列出从0到n的斐波那契数列,并且用Redis缓存.   思路很简单,每次取第n的值的时候判断Redis有没有,有就不用再去计算了,没有就计算一次存下来,大大减少计

【数学题】斐波拉契数列!

兔子的繁殖能力很强,一对兔子每过一个月会生一对小兔子.而刚出生的一对小兔子经过一个月后长大,再过一个月生出一对小兔子.如果从刚生的一对兔子算起,一年后总共有多少对兔子? 答案:233对.每个月结束时,兔子的对数:1  12  23  34  55  86  137  218  349  5510 8911 14412 233设数列{An}={1,2,3,5,8--}={A1,A2--An-1,An}.则An=An-1+An-2(下标)第n月结束时兔子对数=n-1月兔的对数+新生兔子对数.新生兔对

hdu 4549 M斐波那契数列

click here ~~ Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n

HDU 3977 求斐波那契循环节

题意:求斐波那契数列模一个数的循环节的长度. 分析过程:首先我们知道fib数列模p如果出现了连续的1,0就意味这着开始循环了,因为接下来的项就是1 1 2 3 5等等. 那么很显然如果在第k位第一次出现了1,0,那么对于以后的1,0都可以表示为k*m.   那么,现在我们考虑如果fib数列模p在第pos位第一次出现了0,那么设0前面的那个数为a,则接下来的序列将是a,0,a, a,2a,3a,5a,8a,.....可以看出a的系数就是一个fib数列,那么我们就可以得到fib(k+i)%p=a*f

HDOJ/HDU 1250 Hat&amp;#39;s Fibonacci(大数~斐波拉契)

Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1. F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4) Your task is to take

HDU 3978 斐波那契循环节

题意:给出f(f(f...f(n)...)) 总共嵌套k次.问最后模p的值是多少. 首先应该明白的是这个题有循环节的.一个数模N的循环节就是这个数分解成素因子乘积的形式p1^a1*p2^a2*p3^a3...后,斐波那契模pi^ai的循环节的最大公约数. 那么一个素数的k次幂的循环节=斐波那契模上这个素数的循环节乘上p^(k-1). 而一个素数p的循环节 如果p>5并且是5的二次剩余,那么循环节就是(p-1)的因子,否则就是2*(p+1)的因子.所以2 3 5 的时候需要特判一下. 知道这些就能

内存管理-根据题目,编这个程序怎么会联想到用斐波那契数列?

问题描述 根据题目,编这个程序怎么会联想到用斐波那契数列? 4.编写-个函数,它返回函数自身被调用的次数,并在一个循环中测试之. #include int Fibonacci(int n); int count; int main(void) { int n; printf("input the max term of Fibonacci:"); while( scanf("%d",&n) == 1 ) { count = 0; Fibonacci(n);