#include<bits/stdc++.h>
using namespace std;
long long f[]={0, 1, 1, 2, 8, 18, 59, 155, 460, 1276, 3672, 10357, 29533};
int main()
{
int len=sizeof(f)/sizeof(f[0]);
int a,b,c,d,e,k;
int n=5;
int start=-10,end=10;
for(a=start;a<=end;a++){
for(b=start;b<=end;b++){
for(c=start;c<=end;c++){
for(d=start;d<=end;d++){
for(e=start;e<=end;e++){
for(k=start;k<=end;k++){
if(f[n]==(a*f[n-1]+b*f[n-2]+c*f[n-3]+d*f[n-4]+e*f[n-5]+k)){
int flag=0;
for(int m=n;m<len;m++){
if(!(f[m]==(a*f[m-1]+b*f[m-2]+c*f[m-3]+d*f[m-4]+e*f[m-5]+k))){
flag=1;
break;
}
}
if(flag==0){
cout<<"ok!"<<endl;
cout<<"a= "<<a<<" b= "<<b<<" c= "<<c<<" d= "<<d<<" e= "<<e<<" k= "<<k<<endl;
cout<<"General formula:"<<endl;
printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",a,b,c,d,e,k);
}
}
}
}
}
}
}
}
return 0;
}
数列放入,会有 f[n]=a*f[n-1]+b*f[n-2]+c*f[n-3]+d*fn-4]+e*f[n-5]+k 的通项公式输出,结果可能有多个,不过在小系数的情况下基本上都应该是属于等价的,start,end调节爆破范围,视个人机器和时间决定,本人上述代码1s。
放个改进版的吧,不私藏了:
#include<bits/stdc++.h>
using namespace std;
long long f[]={0, 1, 1, 2, 8, 18, 59, 155, 460, 1276, 3672, 10357, 29533};
class re{
public:
int r[6];
int num=0;
int len=6;
re(int _a,int _b,int _c,int _d,int _e,int _k)
{
int in=0;
r[in++]=_a;
r[in++]=_b;
r[in++]=_c;
r[in++]=_d;
r[in++]=_e;
r[in++]=_k;
for(int i=0;i<6;i++)
{
if(r[i]==0)
num++;
}
for(int i=5;i>=0;i--){
if(r[i]!=0)break;
else len--;
}
}
};
bool comp(re a,re b){
if(a.len<b.len)return true;
if(a.len>b.len)return false;
if(a.num>b.num)return true;
if(a.num<b.num)return false;
else {
for(int i=0;i<6;i++){
if(a.r[i]!=0&&b.r[i]==0){
return true;
}
if(a.r[i]==0&&b.r[i]!=0){
return false;
}
}
}
return false;
}
vector<re> t;
int main()
{
int len=sizeof(f)/sizeof(f[0]);
int a,b,c,d,e,k;
int n=5;
int start=-10,end=10;
for(a=start;a<=end;a++){
for(b=start;b<=end;b++){
for(c=start;c<=end;c++){
for(d=start;d<=end;d++){
for(e=start;e<=end;e++){
for(k=start;k<=end;k++){
if(f[n]==(a*f[n-1]+b*f[n-2]+c*f[n-3]+d*f[n-4]+e*f[n-5]+k)){
int flag=0;
for(int m=n;m<len;m++){
if(!(f[m]==(a*f[m-1]+b*f[m-2]+c*f[m-3]+d*f[m-4]+e*f[m-5]+k))){
flag=1;
break;
}
}
if(flag==0){
/* //show everytimes
cout<<"ok!"<<endl;
cout<<"a= "<<a<<" b= "<<b<<" c= "<<c<<" d= "<<d<<" e= "<<e<<" k= "<<k<<endl;
cout<<"General formula:"<<endl;
printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",a,b,c,d,e,k);
*/
re p=re(a,b,c,d,e,k);
t.push_back(p);
}
}
}
}
}
}
}
}
sort(t.begin(),t.end(),comp);
cout<<"Over!This maybe the best method!"<<endl;
int ind=5;
printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--]);
return 0;
}