好久没写博客了,周六晚上破实验课好无聊,把下午做的题贴一下。
思路很简单,预处理到30就足足够了,10以内是有最优选择的,大数的时候因为两个数字之间的差值是特别大的,所以直接贪心一下就可以了。没学过Java,之前就写过一个java大数的A+B;这次网络赛现学现卖,一A真的是刺激!
///package D;
import java.util.Scanner;
import java.math.*;
public class Main {
public static void main(String[] args){
int fib[]=new int[33];
fib[1]=1;
fib[2]=1;
for(int i=3;i<30;i++)
fib[i]=fib[i-1]+fib[i-2];
BigInteger F[]=new BigInteger[30];
for(int i=1;i<30;i++)
{
int n=fib[i];
n-=1;//
BigInteger a[][]= {{BigInteger.ONE,BigInteger.ONE},{BigInteger.ONE,BigInteger.ZERO}};
BigInteger b[][]={{BigInteger.ONE,BigInteger.ZERO},{BigInteger.ZERO,BigInteger.ONE}};//单位矩阵
while(n>0)
{
if(n%2==1)
{
b=q(a, b);
}
a=q(a, a);n/=2;
}
F[i]=b[0][0];
}
//for(int i=1;i<20;i++)
// System.out.println(i+" "+F[i]);
Scanner scan=new Scanner(System.in);
int len=scan.nextInt();
for(int cas=1;cas<=len;cas++)
{
// if(cas!=1) System.out.println();
BigInteger a;
a=scan.nextBigInteger();
int ans[]=new int[30];
int num=0;
for(int i=29;i>=6;i--)
{
//System.out.println(num+" "+F[i]);
if(a.compareTo(F[i])>=0)
{
num++;
ans[num]=i;
a=a.subtract(F[i]);
}
}
if(a.compareTo(BigInteger.valueOf(10))>0)
{
System.out.println("-1");
}else {
int flag=0;
if(a.equals(BigInteger.ONE)) {
System.out.print("1");flag=1;
}
if(a.equals(BigInteger.valueOf(2))) {
System.out.print("1 2");flag=1;
}
if(a.equals(BigInteger.valueOf(3))) {
System.out.print("1 2 3");flag=1;
}
if(a.equals(BigInteger.valueOf(4))) {
System.out.print("1 2 4");flag=1;
}
if(a.equals(BigInteger.valueOf(5))) {
System.out.print("1 2 3 4");flag=1;
}
if(a.equals(BigInteger.valueOf(6))) {
System.out.print("1 5");flag=1;
}
if(a.equals(BigInteger.valueOf(7))) {
System.out.print("1 2 5");flag=1;
}
if(a.equals(BigInteger.valueOf(8))) {
System.out.print("1 2 3 5");flag=1;
}
if(a.equals(BigInteger.valueOf(9))) {
System.out.print("1 2 4 5");flag=1;
}
if(a.equals(BigInteger.valueOf(10))) {
System.out.print("1 2 3 4 5");flag=1;
}
if(num>0)
{
if(flag==0)
{
System.out.print(ans[num]);
for(int i=num-1;i>0;i--)
System.out.print(" "+ans[i]);
}
else {
for(int i=num;i>0;i--)
System.out.print(" "+ans[i]);
}
}
System.out.println();
}
}
scan.close();
}
static BigInteger [][] q(BigInteger a[][],BigInteger b[][]){//
BigInteger value1=a[0][0].multiply(b[0][0]).add(a[0][1].multiply(b[1][0]));
BigInteger value2=a[0][0].multiply(b[0][1]).add(a[0][1].multiply(b[1][1]));
BigInteger value3=a[1][0].multiply(b[0][0]).add(a[1][1].multiply(b[1][0]));
BigInteger value4=a[1][0].multiply(b[0][1]).add(a[1][1].multiply(b[1][1]));
BigInteger c[][]=new BigInteger [2][2];
c[0][0]=value1;
c[0][1]=value2;
c[1][0]=value3;
c[1][1]=value4;
return c;
}
}