您的位置:首页 > 其它

差分序列

2015-10-09 08:32 260 查看
差分序列

0阶差分序列(就是序列本生):     h0,h1,h2,···,hn,···
1阶差分(△hn = hn+1 - hn):    △h0,△h1,△h2,···,△hn,···
······

定理一:
设序列的通项公式是n的p次多项式,即
hn = a(p)*n^p + a(p-1)*n^p-1 + ··· + a1*n + a0
则对所有△(p+1)hn = 0.

定理二:
差分表的第0条对角线等于
c0,c1,c2,···,cp,0,0,0,···,  其中cp != 0
的序列的通项公式满足
hn = c0(n,0) + c1(n,1)+c2(n,2)+···+cp(n,p)

定理三:
差分表的第0条对角线等于
c0,c1,c2,···,cp,0,0,0,···,  其中cp != 0
则
k(0-n)∑hk = c0(n+1,1) + c1(n+2,2) + ··· + cp(n+1,p+1)

1.给出了一个数列的前若干项,要求推测后面的项

int h[MAXN][MAXN];      // 存放差分序列,h[i][MAXN]为i阶差分
int n;                  // 前n个数
int m;                  // 要得到的后n个数

//计算差分序列
void CalDifferentSequence()
{
for(int i = 1; i < n; ++i)
for(int j = 0; i+j < n; ++j)
h[i][j] = h[i-1][j+1] - h[i-1][j];
for(int i = 1; i <= m; ++i)
h[n-1][i] = h[n-1][0];
for(int i = n-2; i >= 0; --i)
for(int j = 0; j < m; ++j)
h[i][n-i+j] = h[i][n-i+j-1] + h[i+1][n-i+j-1];
}


POJ 2515 Birthday Cake

题意:给定m和n,求∑(i^m) (1<= i <= n),1 <= n <= 10 ^ 41 and 3 <= m <= 100。

思路:n很大m很小可以直接利用定理三求解。

code:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

public final int MAXN = 105;

Scanner cin = new Scanner(System.in);
public BigInteger c[] = new  BigInteger[MAXN];
BigInteger h[][] = new BigInteger[MAXN][MAXN];
BigInteger N;
int M;
void init() {
c[1] = N;
for(int i = 2; i <= M + 1; ++i) {
c[i] = c[i-1].multiply(N.subtract(BigInteger.valueOf(i-1))).divide(BigInteger.valueOf(i));
}
}

void solve() {
int T = cin.nextInt();
while (T-- > 0) {
N = cin.nextBigInteger();
N = N.add(BigInteger.ONE);
M = cin.nextInt();
init();
for (int i = 0; i <= M; ++i) {
h[0][i] = BigInteger.valueOf(i).pow(M);
}
for (int i = 1; i <= M; ++i) {
for (int j = 0; j <= M - i; ++j) {
h[i][j] = h[i - 1][j + 1].subtract(h[i - 1][j]);
}
}
BigInteger ans = BigInteger.ZERO;
for (int i = 0; i <= M; ++i) {
ans = ans.add(c[i+1].multiply(h[i][0]));
}
System.out.println(ans);
}
cin.close();
}

public static void main(String[] args) {
new Main().solve();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: