zoukankan      html  css  js  c++  java
  • 南昌网络赛C.Angry FFF Party

    南昌网络赛C.Angry FFF Party

    Describe

    In ACM labs, there are only few members who have girlfriends. And these people can make FFF Party angry easily. One day, FFF Party prepared a function (F)and a set (S).

    [left{ egin{aligned} 1,&&n = 1,2 \ F(n-1)+F(n-2), && nge3 end{aligned} ight. ]

    There are several unequal positive integers $ f _i$ in the set (S).

    They calculated the value of (W=sum_{fin s}{F(F(f))}), and tried to cause (W)damage to those who have girlfriends. Suppose you are not a single dog and have been attacked. Now, give you the value of (W) and please write a program to calculate these (fi) in set (S).

    Input

    The first line consists of a single integer (T) denoting the number of test cases.

    (T) lines follow, with an integer in each, denoting the result of (W).

    Output

    For each test case, print a sequence of space-separated integers (fi) satisfying the equation.

    If there are more than one answers, please print the lexicographically smallest one.

    If there’s no such sequence, print (-1) instead.

    Constraints

    $1le T le10 $

    (1le W leq 10^{100,000})

    样例输入

    2
    1
    3
    

    样例输出

    1
    1 2 3
    

    题意

    给你一个很大的数,让你从斐波拉切的斐波拉切数列中选择任意多个数,使其和等于这个数。

    题解

    ​ 本来想直接复制粘贴题目的,但是数学公式实在太恶心,复制不过来,于是就按照(OYJY)大佬的指示,下载了个markdown编辑器typora ,但是不知是我的linux系统不行,还是搜狗输入法不行,切换不了中文输入法,于是悲催的我只能再wps中打中文,再粘贴过去。qwq.

    n天之后新发现:

    原来只要不从终端打开typora就可以切换输入法啦。另外告诉各位不能显示数学公式的小伙伴,在新建随便的那个页面左栏设置默认编辑器里,需要勾选启用数学公式支持

    ​ 开始进入正题,通过打表 c++已选手退出群聊 发现,其实只有28个数,而且除了前五个数相差较小,后面的数基本相差巨大,也就是前面所有的数加起来都没有下一个数大。于是我们从大到小一个一个减,能减就减,到零或者剪完为止,是不是很简单,。

    但是我不会 java ,于是我学了一天的 java,安装eclipse安了一下午,菜的真实,然后刷了几道水题,最终切了这道早就想切的题了。

    因为输入的是字典序最小的一组解,所以当数小与(10)时,要打表处理

    代码

    import java.io.*;
    import java.math.*;
    import java.util.*;
    public class Main {
    	
    	public static void main(String[] args) 
    	{
    		Scanner cin=new Scanner(new BufferedInputStream(System.in));
    		
    		BigInteger list[]=new BigInteger[30];
    		BigInteger tp[][]=new BigInteger[3][3],a[][]=new BigInteger[3][3];
    		int f[]=new int[30],flag=0;
    		a[1][1]=BigInteger.ONE; a[1][2]=BigInteger.ONE;
    		a[2][1]=BigInteger.ONE; a[2][2]=BigInteger.ZERO;
    		f[0]=0; f[1]=1;
    		
    		for(int i=2;i<=29;i++) f[i]=f[i-1]+f[i-2];
    		for(int i=1;i<=29;i++)
    		{
    			tp=MatrixPower(a,2,f[i]-1);
    			list[i]=tp[1][1];
    		}
    		//for(int i=1;i<=20;i++) System.out.println(list[i]);
    		int tot=0; tot=cin.nextInt();
    		while(tot>0)
    		{
    			tot=tot-1;
    			BigInteger n=cin.nextBigInteger();
    			//tp=MatrixPower(a,2,n-1);
    			//System.out.println(tp[1][1].toString());
    			flag=get_ans(n,28,list);
    			if (tot>0)System.out.println("");
    		}
    	}
    	public static int get_ans(BigInteger n,int maxn,BigInteger list[])
    	{
    		//System.out.println("now= "+n);
    		if (n.compareTo(BigInteger.ZERO)==0) return 0;
    		if (maxn==0||maxn==4)
    		{
    			System.out.print("-1");
    			return -1 ;
    		}
    		BigInteger a[]=new BigInteger[11];
    		for(int i=1;i<=10;i++) a[i]=BigInteger.valueOf(i);
    		if (n.compareTo(a[10])<=0)
    		{
    			//System.out.println("lalala ");
    			if (n.compareTo(a[1])==0)System.out.print("1");
    			if (n.compareTo(a[2])==0)System.out.print("1 2");
    			if (n.compareTo(a[3])==0)System.out.print("1 2 3");
    			if (n.compareTo(a[4])==0)System.out.print("1 2 4");
    			if (n.compareTo(a[5])==0)System.out.print("1 2 3 4");
    			if (n.compareTo(a[6])==0)System.out.print("1 5");
    			if (n.compareTo(a[7])==0)System.out.print("1 2 5");
    			if (n.compareTo(a[8])==0)System.out.print("1 2 3 5");
    			if (n.compareTo(a[9])==0)System.out.print("1 2 4 5");
    			if (n.compareTo(a[10])==0)System.out.print("1 2 3 4 5");
    			return 0;
    		}
    		for(int i=maxn;i>=1;i--)
    		{
    			if (n.compareTo(list[i])>=0)
    			{
    				BigInteger tt=n.subtract(list[i]);
    				int pd=get_ans(n.subtract(list[i]),i-1,list);
    				if (pd==0 && tt.compareTo(BigInteger.ZERO)>0)System.out.printf(" ");
    				if (pd==0)System.out.printf("%d",i);
    				if (pd==0)return 0;
    				return -1;
    			}
    		}
    		return 0;
    	}
    	public static BigInteger[][] MatrixMultiply(BigInteger a[][],BigInteger b[][],int n,int p,int m)
    	{
    		BigInteger c[][]=new BigInteger[n+1][m+1];
    		for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			c[i][j]=BigInteger.ZERO;
    		for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)	
    		for(int k=1;k<=p;k++)
    			c[i][j]=c[i][j].add(a[i][k].multiply(b[k][j]));
    		return c;
    	}
    	public static BigInteger[][] MatrixPower(BigInteger a[][],int n,int p)
    	{
    		BigInteger ans[][]=new BigInteger[n+1][n+1];
    		for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if (i==j)ans[i][j]=BigInteger.ONE;
    			else ans[i][j]=BigInteger.ZERO;
    		while(p>0)
    		{					 
    			if ((p&1)==1)ans=MatrixMultiply(ans,a,n,n,n);
    			p=p/2;
    			a=MatrixMultiply(a,a,n,n,n);
    		}
    		return ans;
    	}
    }
    
    
  • 相关阅读:
    android MotionEvent中getY和getRawY的区别
    Volley之ByteArrayPool
    读懂Volley,必须要理解的几个问题
    Fragment中getContext得到的context从哪来?(基于androidx.fragment:1.2.5源码)
    ViewPager(三)两个熊孩子天生不一样
    ViewPager(二) Adapter的爱恨情仇
    ViewPager(一) 初相识
    Android Volley框架源码详细解析
    Vue-Switch-Demo
    Redis杂化
  • 原文地址:https://www.cnblogs.com/mmmqqdd/p/10802564.html
Copyright © 2011-2022 走看看