南昌网络赛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\).
\begin{aligned}
1,&&n = 1,2 \\
F(n-1)+F(n-2), && n\ge3
\end{aligned}
\right.
\]
There are several unequal positive integers $ f _i$ in the set \(S\).
They calculated the value of \(W=\sum_{f\in 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
$1\le T \le10 $
\(1\le 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;
	}
}
南昌网络赛C.Angry FFF Party的更多相关文章
- dp--2019南昌网络赛B-Match Stick Game
		dp--2019南昌网络赛B-Match Stick Game Xiao Ming recently indulges in match stick game and he thinks he is ... 
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
		线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ... 
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
		题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ... 
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
		ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ... 
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
		ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ... 
- 南昌网络赛 H The Nth Item
		南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化 注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费 #include<bits/stdc++ ... 
- 分治维护dp——19南昌网络赛C/cf750E
		南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ... 
- 2019 ICPC 南昌网络赛
		2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ... 
- Magic Master(2019年南昌网络赛E题+约瑟夫环)
		目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ... 
随机推荐
- mysql被收购  用mariadb
			~]# systemctl start mysql.service 要启动MySQL数据库是却是这样的提示 Failed to start mysqld.service: Unit not found ... 
- JQuery动画之滑入滑出动画
			1. 滑入动画(类似于商店的卷帘门) $(selector).slideDown(speed, 回调函数); 解释: 此语句实现的功能为, 在XX时间内, 下拉动画, 显现元素. 当 slideDow ... 
- Java并发之同步工具类
			1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ... 
- PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
			在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ... 
- iptables 有关计算机名解析问题
			遇到一奇怪现象: 1.开启防火墙(iptables)所有的用计算机名解析的连接全部是失效,但是用IP的一切正常.ping计算机名不通.但是ping IP地址一切OK: 2.关闭防火墙(iptables ... 
- Linux dd烧写系统
			虽然用dd指令烧写系统很简单,但是久而久之忘得也太快了,赶紧整理一下. .img 系统镜像 .iso U盘启动引导文件 1. 先来查看本机磁盘情况,打开Linux终端界面(快捷键Ctrl + Alt ... 
- HearthBuddy CSharpCodeProvider  如何编译cs文件
			源码 源码1 namespace Hearthbuddy.Windows{ // Token: 0x02000041 RID: 65 public class MainWindow : W ... 
- OpenCL如何获取最小线程并行粒度
			由于OpenCL是为各类处理器设备而打造的开发标准的计算语言.因此跟CUDA不太一样的是,其对设备特征查询的项更上层,而没有提供一些更为底层的特征查询.比如,你用OpenCL的设备查询API只能获取最 ... 
- 使用IEDriverServer.exe驱动IE,实现自动化测试
			1. 下载IEDriverServer: https://www.nuget.org/packages?q=IEDriver 2. 解压缩得到IEDriverServer.exe和IEDriverSe ... 
- 8. find
			find使用 find命令的主要作用是对树形目录层次结构进行彻底检查. find命令的一般格式: find pathname -expressions find常用表达式 在当前文件夹中找出名 ... 
