UVALive 4855 Hyper Box

Description

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 dimensional monument as an N-dimensional hyper-box, which can be divided into some N dimensional hypercells. The length of each of the sides of a hyper-cell is one. They will use some N-dimensional bricks (or hyper-bricks) to build this monument. But the length of each of the N sides of a brick cannot be anything other than fibonacci numbers. A fibonacci sequence is given below:

1, 2, 3, 5, 8, 13, 21...

As you can see each value starting from 3 is the sum of previous 2 values. So for N = 3 they can use bricks of sizes (2,5,3), (5,2,2) etc. but they cannot use bricks of size (1,2,4) because the length 4 is not a fibonacci number. Now given the length of each of the dimension of the monument determine the minimum number of hyper-bricks required to build the monument. No two hyper-bricks should intersect with each other or should not go out of the hyper-box region of the monument. Also none of the hyper-cells of the monument should be empty.

Input

First line of the input file is an integer T(1T100) which denotes the number of test cases. Each test case starts with a line containing N(1N15) that denotes the dimension of the monument and the bricks. Next line contains N integers the length in each dimension. Each of these integers will be between 1 and 2000000000 inclusive.

Output

For each test case output contains a line in the format Casex:M where x is the case number (starting from 1) and M is the minimum number of hyper-bricks required to build the monument.

Sample Input

2 
2 
4 4 
3 
5 7 8

Sample Output

Case 1: 4 
Case 2: 2

题意:就是给定n个数 ,把其中不是斐波那契数的分解成数目最少的斐波那契数的和贪心的思路找到最大的小于这个数的值 ,然后相减,直到差为一个斐波那契数

#include <iostream>
#include <cstring>
#include <set>
#include <cstdio>
using namespace std;

typedef long long LL;

const int maxn =55;

LL f[maxn],x[20];

set<long long >fib;

void init(){
    f[0]=1;
    f[1]=1;
    fib.insert(1);
    for(int i=2;i<maxn;i++){
        f[i]=f[i-1]+f[i-2];
    fib.insert(f[i]);
    }
}

int main()
{
    int n,cas=1,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%lld",&x[i]);
        init();
        int i,j;
        long long ans=1;
        int cnt=1;
        for(i=0;i<n;i++){
            if(fib.find(x[i])==fib.end()){
                cnt=1;
                int s=x[i];
              //  cout<<"x[i] "<<x[i]<<endl;
                while(fib.find(s)==fib.end()){
                    int t=lower_bound(f,f+55,s)-f;
                    s=s-f[t-1];
                    cnt++;
                }
              //cout<<"cnt "<<cnt<<endl;
              ans*=cnt;
            }
        }
        printf("Case %d: %lld\n",cas++,ans);
    }
    return 0;
}


你可能感兴趣的:(UVALive 4855 Hyper Box)