您的位置:首页 > 产品设计 > UI/UE

数论+差分 hdu1121 Complete the Sequence

2016-03-03 00:35 555 查看
数学真的是神奇啊

第一次见差分这个东西

对于数列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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: