数论+差分 hdu1121 Complete the Sequence

数学真的是神奇啊

第一次见差分这个东西

对于数列a1 , a2 , a3 , a4 

a2-a1,a3-a2,a4-a3 为一阶差分(b1,b2,b3)

b2-b1,b3-b2 为二阶差分

然后对于题目中的这种多项式 P(n) = aD.n^D+aD-1.n^D-1+...+a1.n+a0 

p 的D-1阶差分就绝对可以得到一个常数(这个可以证明)!!!差分是处理多项式很重要的一个思想

对于多项式的题,多用数学归纳法,以及也可以对式子的化简,也可以从小到大找到其中的规律,或者采用搜索的方式处理

现在我们在D-1阶差分的结果后面加上c个数,往回推就可以得到后面的c个数

加c个数加什么数呢,,,,

加的是D-1阶差分这个数,,,,

要是阶数越小,我们在越小的差分就可以得到一串相同的数字。。。。这个要自己想想

代码如下

/*
ID: meixiny1
PROG: test
LANG: C++11
*/
//差分求数列
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
#define PI 3.1415926535898
//#define LOCAL
int dp[101][101];
int main()
{
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	int t;scanf("%d",&t);
	while(t--){
		int n,m;scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)scanf("%d",&dp[0][i]);
		for(int i=1;i<n;i++){
			for(int j=0;j<n-i;j++){
				dp[i][j] = (dp[i-1][j+1]-dp[i-1][j]);
			}
		}
		for(int i=1;i<=m;i++){
			dp[n-1][i] = dp[n-1][0];
		}
		for(int i=n-2;i>=0;i--){
			for(int j=1;j<n+m;j++){
				dp[i][j]=dp[i+1][j-1]+dp[i][j-1];
			}
		}
		for(int i=n;i<m+n-1;i++){
			printf("%d ",dp[0][i]);
		}
		printf("%d\n",dp[0][m+n-1]);
	}
	return 0;
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值