计蒜客 南昌网络赛 C. Angry FFF Party(java大数快速幂)

好久没写博客了,周六晚上破实验课好无聊,把下午做的题贴一下。

思路很简单,预处理到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;  
    }

 
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值