zty_luogu @ 2021-08-03 19:49:13
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int f[5002][1020]={{},{0,1},{0,2}};
int arrlen(int a[]){
int i=0;
while(a[i]!=0) i++;
return i;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
int len=1;
cin>>n;
if(n==0)
{
cout<<0;
return 0;
}
for(int i=3;i<=n;i++)
{
for(int j=1;j<=len;j++)
{
f[i][j]=f[i-1][j]+f[i-2][j];
}
for(int j=1;j<=len;j++)
{
if(f[i][j]>=10)
f[i][j+1]+=f[i][j]/10,f[i][j]%=10;
}
if(f[i][len+1]>0)len++;
}
for(int i=len;i>=1;i--)
cout<<f[n][i];
return 0;
}
CE了为什么,求助
by L107 @ 2021-09-11 20:53:11
这道题其实不用拷贝数据,直接mod运算就可以了。 具体操作见下
#include<bits/stdc++.h>
using namespace std;
int a[3][5003],n;
int main()
{
a[0][0]=1;
a[1][0]=1;
cin>>n;
if(n==0)
{
cout<<0;
return 0;
}
if(n==1)
{
cout<<1;
return 0;
}
int i,j,sw=1,val,add=0,lastAdd;
for(i=0;i<=n-2;i++)
{
add=0;
lastAdd = 0;
for(j=0;j<=sw;j++)
{
if(j==sw&&add==0) break;
val=a[ i%3 ][j]+a[ (i+1)%3 ][j]+add;
a[ (i+2)%3 ][j]=val%10;
if(val>9) add=1;
else add=0;
if(j==sw-1&&add==1)
lastAdd = 1;
}
if (lastAdd==1 ) sw++;
}
for(j=sw-1;j>=0;j--)
cout<<a[(i+1)%3][j];
return 0;
}