构造等比数列,求数列通项。

突然想起了高中的知识,用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)=pa(n1)+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("");	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值