hdu 1021 斐波那契2,找规律

背景:暴力必定超数据结构范围,因为斐波那契类型数列,成指数形式爆炸增长。故写了数据发现取余30不影响结果。

学习:1.数论类题可以写出几组数据找规律,猜结论。

我的代码:

#include<stdio.h>
int str[1000009] = { 7, 11 };
int main()
{
	int n;
	for (int i = 2; i <=1000000; i++){
		str[i] = (str[i - 1] + str[i - 2])% 30;
	}
	while (scanf("%d", &n) != EOF){
		if (str[n ] % 3 == 0)  printf("yes\n");
		else printf("no\n");
	}
	return 0;
}

也有人根据同余的性质写出递推式{a1≡b1(mod3),得a1+b1(mod3)}:

str[i] = str[i - 1] %3+ str[i - 2]%3;

oms解法:

找规律,一次找出f[0]~f[n]的对三取余的数:

1,2,0,2,2,1,0,1,1,2,0,2,2,1,0,1,1,2,0,2,2,1,0,1.........不断循环

我们的目的是找到取余之后的0与n的关系,除了第一个,0和0之间都是有三个数,所以容易得到只要n%4==2,那么f[n]=0.

时间: 2024-10-12 11:53:02

hdu 1021 斐波那契2,找规律的相关文章

HDU 1021(斐波那契数与因子3 **)

题意是说在给定的一种满足每一项等于前两项之和的数列中,判断第 n 项的数字是否为 3 的倍数. 斐波那契数在到第四十多位的时候就会超出 int 存储范围,但是题目问的是是否为 3 的倍数,也就是模 3 值为 0 ,考虑到余数只有0,1,2,而且每项由前两项求和得到,也就是说余数一定会出现循环的规律,从首项开始,前 8 项模 3 的结果是:1 2 0 2 2 1 0 1,接下来的两项模 3 的结果仍是 1 2 ,那么整个序列就呈现出以 8 为周期的特点,只要模 8 的结果为 3 或者 7 就输出

51nod 1350 斐波那契表示 (找规律递推)

分析: - -! 找规律...首先可以归纳证明,对于n,最佳的取法是先取不大于n的最大的那个斐波那契数,然后递推.从而可以得到算出F(n)的一个方法,但是n的范围太大了,先算出n较小的情况,会发现: 第三列为F(n),第二列为G(n),可以看出第k块是由k-1块和k-2块+1合在一起得到的,从而可以先预处理前k块之和(k不会超过100),然后对于每个n,先找到最大的不超过n的那块,然后对剩下的项递归,总的复杂度为O(T*logn). 1 #include<iostream> 2 #includ

【2017.11.2】洛谷 mNOIP 比赛 | T1 斐波那契【找规律】

Day 1 T1  斐波那契 找规律. 我们发现,兔子的编号减去斐波那契数列中第一个比它小的数之后就可以得到它的父亲.一直找减找减找减...就ok了. 题解(%%%dalao's 代码)

51NOD 1491 黄金系统 &amp;&amp; Codeforces 458 A. Golden System(斐波那契数列 + 找规律)

传送门 q = 5√+12在黄金系统下面a0a1...an等于 ∑ni=0ai?qn?i,其中ai 是 0 或者 1. 现在给出两个黄金系统下面的数字,请比较他们的大小. Input 单组测试数据. 第一行有一个字符串 a . 第二行有一个字符串 b . 他们都是非空串,可能有前导 0,并且只有 0 和 1组成,长度不超过 100000. Output 如果 a>b,输出 >: 如果 a= b,输出 =: 如果 a<b,输出 <: Input示例 00100 11 Output示例

HDU 1316 斐波那契数列+高精度

How Many Fibs? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4235    Accepted Submission(s): 1669 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-1

HDU 2516 斐波那契博弈

可以先列举一部分小数据,可以发现以fib[0]=2,fib[1]=3开始的斐波那契数列中的数字表示必胜态 #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define ll long long const ll INF = 0x7fffffff; int k; ll num[100]; void get_table() { num[0]=2 , num[1] =

HDU 1848 斐波那契博弈

斐波那契数列数列博弈:给你三堆石子,每次只能取费波契数列个石子,问先手赢输出“Fibo”,否则输出“Nacci”. 主要求出SG函数,然后看 异或值 ,最后根据异或值是否是 0  #include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[20]; int sg[1050], mex[1050]; int main() { int m,n,p; for(int i

HDU 5451 广义斐波那契数列

这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2) = 10*f(n-1) - f(n-2) 那么就可以写成矩阵相乘的形式了 (f(n) , f(n-1))

HDU 2516 取石子游戏 (斐波那契博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input输入有多组.每组第1行是2<=n<2^31. n=0退出. Output先取者负输出"Second win". 先取者胜输