这道题我开始时写了记忆化:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N = 1e5+1;
int mem[N];
int fb(int x){
if(mem[x])return mem[x];
if(x==1||x==2)return mem[x]=1%n;
else return mem[x]=(fb(x-1)+fb(x-2))%n;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
int ans = 1;
while(fb(ans)!=0||fb(ans+1)!=1)ans++;
cout<<ans<<endl;
return 0;
//十年OI一场空,define int 见祖宗。
//十年OI一场空,不开long long见祖宗。
}
检查了一下,是不是记忆化数组太小了?
于是。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N = 1e10+1;
int mem[N];
int fb(int x){
if(mem[x])return mem[x];
if(x==1||x==2)return mem[x]=1%n;
else return mem[x]=(fb(x-1)+fb(x-2))%n;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
int ans = 1;
while(fb(ans)!=0||fb(ans+1)!=1)ans++;
cout<<ans<<endl;
return 0;
//十年OI一场空,define int 见祖宗。
//十年OI一场空,不开long long见祖宗。
}
好像数组开太大了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N = 1e8+1;
int mem[N];
int fb(int x){
if(mem[x])return mem[x];
if(x==1||x==2)return mem[x]=1%n;
else return mem[x]=(fb(x-1)+fb(x-2))%n;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
int ans = 1;
while(fb(ans)!=0||fb(ans+1)!=1)ans++;
cout<<ans<<endl;
return 0;
//十年OI一场空,define int 见祖宗。
//十年OI一场空,不开long long见祖宗。
}
下次数组要开适当o