java大数取模例子,HPU 1471:又是斐波那契数列??(大数取模)

1471: 又是斐波那契数列??

时间限制: 1 Sec 内存限制: 128 MB

提交: 278 解决: 27 统计

题目描述

大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; f1 = 1; fi = fi-1 + fi-2

现在给你一个数x,聪明的你一定知道这是斐波那契数列中的第几项。

(数据保证x一定有对应的项y,且 0 <= y

输入

第一行一个整数T,表示测试组数。

之后的T行,每行一个数x

输出

对于每个测试数据,输出一行表示数x是第几项

样例输入

2

2

5

样例输出

3

5

c03bd1b809d94f10711553bd1565226a.png

题意

给出一个数,求是斐波那契里的第几项

思路

一开始想着打表,然后直接查找,但是发现数太大了。然后换了个思路,也是打表,然后每个数对1e9+7取模(取模的数字随便找,不会爆范围就行),然后输入数n,遍历打好的斐波那契表,如果n对表中的某一项取模为0,那么该项就是n在斐波那契中的位置。

注意:输入的数n很大,要用字符串输入,然后利用大数取模来操作。(一开始忘了n的范围,一直拿着打好的表中的数来算,导致了WA9。QAQ,罚时爆炸)。

AC代码

#include

#define ll unsigned long long

#define ms(a) memset(a,0,sizeof(a))

#define pi acos(-1.0)

const int mod=1e9+7;

const int maxn=1e4+10;

using namespace std;

char num[maxn];

ll a[maxn];

int l;

int main()

{

int t;

a[0]=0;

a[1]=1;

mapmp;

//打好表,用map记录每个数的位置

for(int i=2;i

{

a[i]=(a[i-1]%mod+a[i-2]%mod)%mod;

mp[a[i]]=i;

}

scanf("%d",&t);

while(t--)

{

ll n;

ms(num);

scanf("%s",num);

int l=strlen(num);

ll ans=0;

//对输入的超大的斐波那契数取模

for(int i=0;i

{

ans=(ans*10+num[i]-'0')%mod;

}

//输出取模后的数的位置

printf("%d\n",mp[ans]);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值