突然想起了高中的知识,用c语言实现了一下。
对于形如
a
(
n
)
=
p
∗
a
(
n
−
1
)
+
h
(
n
)
(
h
(
n
)
是
多
项
式
,
p
!
=
1
)
a(n)=p*a(n-1)+h(n) (h(n)是多项式,p!=1)
a(n)=p∗a(n−1)+h(n)(h(n)是多项式,p!=1)(p==1的话你可以用累加法求)
我们可以构造一个公比为q的等比数列, 达到求通项的目的。详细步骤见链接:别人的知乎回答
我们只需 O(n^2)的时间,就可以实现O(1)时间的查询,这个时间比矩阵快速幂更快,而且你不用去构造关系矩阵,省去了思维时间。
//我这个模板只可以求q为正整数的情况
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
//解a(n)=p*a(n-1)+h(n) [1] (h(n)是多项式)
//a(n)+c+p1*n+p2*n^2.....=p*(a(n-1)+c+p1*(n-1)+p2*(n-2)^2....) [2]
//构造的p1,p2,p3..使[1],[2]两式等价
//这是一个完整的上三角不用高斯消元
const int N=50;
int x[N];
int main(){
int p,n;
scanf("%d%d",&p,&n);
for(int i=0;i<=n;i++)scanf("%d",&x[i]); //次数为i的多次项的系数
for(int i=n;i>=1;i--){//从最高项开始拆分
int temp=1;
x[i]/=(p-1);
for(int j=1;j<=i;j++){//j表示-1的个数
temp=temp*(i-j+1)/j;//二项式系数
//printf("%d\n",temp);
if(j&1)x[i-j]+=x[i]*p*temp;
else x[i-j]-=x[i]*p*temp;
}
}
int a1=1,q,ans,m;
/*a1首项初始值可以等于任意数这里默认为1*/
for(int i=0;i<=n;i++)a1+=x[i];//等比数列首项
//用公式做出前几项,大家可以去验证一下
for(int i=2;i<=10;i++){
int ai=a1*(int)pow(p,i-1);
for(int j=0;j<=n;j++)ai-=x[j]*(int)pow(i,j);
printf("%d ",ai);
}
//for(int i=0;i<=n;i++)printf("%d ",x[i]);puts("");
}