Description
![Download as PDF Download as PDF](https://icpcarchive.ecs.baylor.edu/components/com_onlinejudge/images/button_pdf.png)
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 Nsides of a brick cannot be anything other than fibonacci numbers. A fibonacci sequence is given below:
![\epsfbox{p4855.eps}](https://i-blog.csdnimg.cn/blog_migrate/5937300f789dbba7270dabcc70435832.png)
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(1T
100) which denotes the number of test cases. Each test case starts with a line containingN(1
N
15) 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个数每个数至少是几个个Fibonacci数(可以重复)的和,然后这样把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<LL>fib;
set<LL>::iterator it;
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++)
{
//每个x[i]至少由几个斐波那契数组成(可以重复利用一个数多次)
if(fib.find(x[i])==fib.end())
{
cnt=1;
int s=x[i];
while(fib.find(s)==fib.end())
{
int t=lower_bound(f,f+55,s)-f;
s=s-f[t-1];
cnt++;
}
ans*=cnt;
}
}
printf("Case %d: %lld\n",cas++,ans);
}
return 0;
}