已知斐波那契数列 Fn =Fn−1 +Fn−2 (n>=3),F1 =1,F2 =1
求解该数列的第n项,结果对998244353取模。
输入格式:
输入一个正整数n (1<=n<=10000000)。
输出格式:
输出一个数,数列的第n项
输入样例1:
1
输出样例1:
1
输入样例2:
3
输出样例2:
2
首先说,下面是一段错误代码,因为,段错误😤。我试着找了一下这段代码的上限,基本上就是到48那样,后来发现是递归那里有问题,先求出斐波那契数列的第n项才取模是肯定不行了,第48项后面的超long的范围了。
#include <bits/stdc++.h>
using namespace std;
,
long fib(long num)
{
if(num == 1 ||num == 2)
return 1;
else
return (fib(num-1)+fib(num-2))%998244353;
}
int main()
{
long num;
cin>>num;
cout<<fib(num);
return 0;
}
递归不行那就换循环,接下来,我遇到了新错误,内存超限😤。就是下面这段,
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<long> fib;
fib.push_back(1);
fib.push_back(1);
long num;
cin>>num;
for(int i=2; i<=num; i++)
{
fib.push_back((fib[i-1]+fib[i-2])%998244353);
}
cout<<fib[num-1];
return 0;
}
数组不行,那用变量吧,终于过了o(〃^▽^〃)o
#include <bits/stdc++.h>
using namespace std;
int main()
{
long num;
cin>>num;
if(num<=2)
cout<<1;
else
{
int f1 = 1,f2 = 1;
int res;
for(int i=3; i<=num; i++)
{
res = (f1+f2)%998244353;
f1 = f2;
f2 = res;
}
cout<<res;
}
return 0;
}