暴力得出数列的通项公式

#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;  
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值