3506. 斐波那契数列

单点时限: 2.0 sec

内存限制: 256 MB

有一个数列 {An},其中 A1=1,A2=2,An+2=An+1+An。

给你一个数字,问他是这个数列的第几项。

每行包括数列中的一项 Ak (k≤100000)。

总行数 T≤100。

输入格式
Something like:

2
3
5
8
13
输出格式
Something like:

2
3
4
5
6
提示
Java 和 Python 姿势好不会 MLE,想暴力有一点点难度。

正解当然是 C++ 啦,开动脑筋。

注意是 k≤100000,不是 ak≤100000

/*
思路:费波纳杰数列到100000已经很大了,故找一个合适的p,使其每一项可以模。
*/
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const long long p = 19260817;
long long flag[19260817];
int main() {
	flag[1]=1;
	flag[2]=2;
	long long a,b;
	a=1;
	b=2;
	for(int i = 3; i < 100001; i++) {
		long long c=(a+b)%p;
		a=b;
		b=c;
		flag[c]=i;
	}
	string s;
	while(cin>>s) {
		long long sum=0;
		for(int i = 0; i < s.size(); i++) {
			sum=(sum*10+s[i]-'0')%p;
		}
		cout<<flag[sum]<<endl;
	}

	return 0;

}
#利用python自带的hash更容易解决
flag = [0,1,2]
for i in range(99998):
    t = a + b
    flag.append(hash(t))
    a,b = b,t
while True:
    try:
        print(flag.index(hash(int(input()))))
    except:
        break
发布了45 篇原创文章 · 获赞 21 · 访问量 458

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105179158