题目链接:ZOJ 3702 Gibonacci number
先打一张表,G1[i]表示第i项里有几个t,G2[i]表示第i项里常数是几,根据给的值可以算出来t,如果算出来的不是整数或者小于1输出-1,否则输出解。
会溢出用long long。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N = 20 + 4;
int G1[MAX_N], G2[MAX_N];
void init()
{
G1[0] = 0, G1[1] = 1, G2[0] = 1, G2[1] = 0;
for(int i = 2; i < MAX_N; i++)
{
G1[i] = G1[i - 1] + G1[i - 2];
G2[i] = G2[i - 1] + G2[i - 2];
}
}
int main()
{
init();
int T;
scanf("%d", &T);
while(T--)
{
int i, g, j;
scanf("%d%d%d", &i, &g, &j);
if(g - G2[i] < 1 || (g - G2[i]) % G1[i] != 0)
{
puts("-1");
continue;
}
long long t = (g - G2[i]) / G1[i];
printf("%lld\n", G1[j] * t + G2[j]);
}
return 0;
}