[Contest1351]Fibonacci

Posted evan704

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Contest1351]Fibonacci相关的知识,希望对你有一定的参考价值。

题面

Description

【问题描述】

豆豆最近迷上了Fibonacci数,然后他开始研究Fibonacci数的乘积。现在他想问你某个数能不能分解成两个Fibonacci数的乘积?

Fibonacci数的定义:F0=0,F1=1,Fk=Fk-1+Fk-2。

 

【输入格式】

第一行一个整数T代表提问次数。

接下来T行,每行一个数字A表示豆豆询问你的数。

 

【输出格式】

对于每次提问,如果这个数可以被分解成两个Fibonacci数的成绩输出“Yes”,否则输出“No”。

 

【输入样例】

5

5

4

12

11

10

 

【输出样例】

Yes

Yes

No

No

Yes

 

【数据范围】

对于50%的数据:A≤50;

对于100%的数据:T≤100,0≤A≤109 。

题意

一个SB问你一个数能不能被分解成两个Fibonacci数的乘积。

题解

看看数据范围$10^9$,想想Fibonacci数的增长速度,$F[45]>10^9$,嗯好的啥也别说了打暴力。

(TMD这种傻逼题我考场上居然没特判MDZZ)

#include<iostream>
using namespace std;
int f[50],t,n;
int main()
	f[1]=f[2]=1;
	for(int i=3;i<=45;i++)f[i]=f[i-1]+f[i-2];
//	printf("%d",f[45]);
	scanf("%d",&t);
	while(t--)
		scanf("%d",&n);
		if(n==0)//特判。。
			printf("Yes\n");
			continue;
		
		bool flag=0;
		for(int i=1;i<=45;i++)
			if(f[i]*f[i]>n)break;
			for(int j=i;j<=45;j++)
				if(f[i]*f[j]==n)
					flag=1;
					break;
				
			
			if(flag)break;
		
		if(flag)printf("Yes\n");
		else printf("No\n");
	

  

以上是关于[Contest1351]Fibonacci的主要内容,如果未能解决你的问题,请参考以下文章

P1351 联合权值

欧拉路径Hrbust1351

P1351 联合权值

1351:例4-12 家谱树

leetcode1351

P1351 联合权值(树形dp)