UVA 4855 Hyper Box 斐波那契

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2856

比赛的时候和陈看了好长时间才看明白题意,和吴讨论做了出来,其实吴确实聪明,脑袋瓜子比较灵活

题意:有一个N维的空间,给你各维的长度,有一些n维的砖块,把空间填满,砖块不能交叉,空间不能一部分为空;求最少用的砖块

砖块各维都必须为斐波那契长度

思路:

空间各维分解,若是斐波那契数,不处理,若不是,求出最少用几个斐波那契数组成,最后相 乘就是结果

难点在一个数最少由几个斐波那契数组成;

求出2.1亿内的所有斐波那契数,map映射为1,数组最少46;

初始为x,其实每次取不大于它的斐波那契数,并减去,更新x,重复上述;

代码:

#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
long long a[20];
long long b[49];
int find(long long x)
{
    bool str=true;
    int num=0;
    while(str)
    {
        int i=45;
        while(i!=-1)
        {
            i--;
            if(b[i]<=x)
            {
                x-=b[i];
                num++;
                break;
            }
        }
        if(x==0)
            break;
    }
    //cout<<"num== "<<num<<endl;

    return num;
}
int main()
{
    int t,i,j;
    b[0]=1;
    b[1]=2;
    map<long long ,int> s;
    s[1]++;
    s[2]++;
    for(i=2;i<47;i++)
    {
        b[i]=b[i-1]+b[i-2];
        s[b[i]]++;
    }
    //cout<<"b[45]== "<<b[45]<<endl;
   // cout<<find(4)<<endl;
    //cout<<find(6)<<endl;
    while(cin>>t)
    {
        int p=1;
        while(t--)
        {
            int n;
            cin>>n;
            int i,j;
            long long k=1;
            for(i=0;i<n;i++)
            {
                cin>>a[i];
                if(s[a[i]]==0)
                {
                    k*=find(a[i]);
                }
            }
          cout<<"Case "<<p++<<": "<<k<<endl;
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 01:23:47

UVA 4855 Hyper Box 斐波那契的相关文章

UVA 948 数的斐波那契进制表示

每个正整数都可以分解成斐波那契数列中的几个数相加-- 从大到小贪心法就可以了-- #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string

UVA 4855 Hyper Box

You live in the universe X where all the physical laws and constants are different from ours. For example all of their objects are N-dimensional. The living beings of the universe X want to build an N-dimensional monument. We can consider this N dime

UVA 11885 - Number of Battlefields(斐波那契)

11885 - Number of Battlefields 题意:给周长,求能围成的战场数目,不包括矩形. 思路:具体的递推没递推出来,但是看了网上一个规律,如果包括矩形的答案应该是斐波那契数列(但是奇数情况为0),然后减去矩形数目就是答案,矩形数目为n / 2 - 1,用矩阵快速幂就能求了. 具体的递推过程哪位大神能指点下... 代码: #include <stdio.h> #include <string.h> const long long MOD = 987654321;

UVA - 10183 - How Many Fibs? (斐波那契 + 高精度)

题目传送:UVA - 10183 思路:高精度就可以了,因为10^100以内的斐波那契数不多,根据公式来看,估计就500多,开个1000的数组足够啦,实现的话是用的java,注意这里的斐波那契是从1开始的,我一开始是从0开始的,wa了一下 AC代码: import java.util.Scanner; import java.math.BigInteger; public class Main { public static void main(String args[]) { Scanner

UVA - 11582 Colossal Fibonacci Numbers! (巨大的斐波那契数!)

题意:输入两个非负整数a.b和正整数n(0<=a,b<264,1<=n<=1000),你的任务是计算f(ab)除以n的余数,f(0) = 0, f(1) = 1,且对于所有非负整数i,f(i + 2) = f(i + 1) + f(i). 分析: 1.对于某个n取余的斐波那契序列总是有周期的,求出每个取值的n下的斐波那契序列和周期. 2.ab对T[n]取余,即可确定对n取余的斐波那契序列中f(ab)的位置. #pragma comment(linker, "/STACK:

UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵快速幂,输出等了几秒钟才输出完,肯定会超时.因为所有计算都是要取模的,设F[i]=f[i] mod n.F[0]=F[1]=1.只要出现F[i]=F[i+1]=1,那么整个序列就会重复.例如n=3,则序列为1,1,2,0,2,2,1,0,1,1……第九项和第十项都等于1,所以之后的序列都会重复. 至

hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 --------------------------------------------------------------------------------------------------------------------------------------------

[板子]矩阵快速幂求解斐波那契

在斐波那契数列之中 f[i] = 1*f[i-1]+1*f[i-2]  f[i-1] = 1*f[i-1] + 0*f[i-2]; 即 所以 就这两幅图完美诠释了斐波那契数列如何用矩阵来实现. 摘自:http://blog.csdn.net/nyist_tc_lyq/article/details/52981353 #include<bits/stdc++.h> #define LL long long using namespace std; const long long pi=10000

实现斐波那契神兔

1.用循环实现不死神兔 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契. 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔, 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡, 问:一对刚出生的兔子,一年内繁殖成多少对兔子? 1 1 2 3 5 8 13 21 1 import java.util.Arrays; 2 3 public class Tu { 4 5 public static void main(String