牛牛想要成为hacker 题解(斐波那契构造)
题目链接
题目思路
首先要知道斐波那契正是不能组成三角形并且增长速度最慢的数列。
我比赛是直接构造斐波那契前40项然后后面的等差6765
复杂度差不多是\(O(20n^2)\)
.....后面想了一下是个锤子\(O(20n^2)\)
其实是\(O(20C(n,2))=O(10n^2)\)
却还是只能过88%
有一说一感觉真的应该差不多了
但是题目却是更优的构造方法
前面不放1,后面全部放1
这样可以达到差不多\(O(20n^2)\)
自己代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n,fac[maxn];
signed main(){
scanf("%d",&n);
fac[1]=fac[2]=1;
for(int i=3;i<=40;i++){
fac[i]=fac[i-1]+fac[i-2];
}
for(int i=41;i<=n;i++){
fac[i]=fac[i-1]+6765;
}
for(int i=1;i<=n;i++){
printf("%d ",fac[i]);
}
return 0;
}
正确代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n,fac[maxn];
signed main(){
scanf("%d",&n);
fac[0]=1; fac[1]=2;
for(int i=2;i<=40;i++){
fac[i]=fac[i-1]+fac[i-2];
}
for(int i=41;i<=n;i++){
fac[i]=1;
}
for(int i=1;i<=n;i++){
printf("%d ",fac[i]);
}
return 0;
}
不摆烂了,写题