数论+差分 hdu1121 Complete the Sequence

来源:互联网 发布:淘宝上levis眼镜 编辑:程序博客网 时间:2024/05/17 13:14

数学真的是神奇啊

第一次见差分这个东西

对于数列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: meixiny1PROG: testLANG: 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 LOCALint dp[101][101];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);//freopen("out.txt","w",stdout);#endifint 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;}






0 0
原创粉丝点击