给定一个数列 P(n),这个数列的通项公式可表示为: P(n)=a_{i}i \cdot⋅ n^{i}n**i+a_{i-1}i−1 \cdot⋅ n^{i−1}n**i−1+ ... +a_{1}1 \cdot⋅ n+a_{0}0。 现在给出这个数列的前S个数, 求这个数列接下来的后C项。 注意:输出可能的数中最小的。 输入:第一行数据组数t,之后每组数据分别有S,C和数列的前S项。 输出:对于每一组数据,输出接下来的C项。 t<=5000,S<=100,C<=100,S+C<=100。
输入:
4 6 3 1 2 3 4 5 6 8 2 1 2 4 7 11 16 22 29 10 2 1 1 1 1 1 1 1 1 1 2 1 10 3
输出:
7 8 9 37 46 11 56 3 3 3 3 3 3 3 3 3 3
每次 求两项之间的差,形成一个新序列,不断向下求,知道序列公差为0的时候,再倒推回去,就可以的到完整序列
#include<iostream> #include<iomanip> using namespace std; int nums[100][100]; int main(){ int i,j; int time; scanf("%d",&time); while(time--){ int s,c; for(i=0;i<100;i++){ for(j=0;j<100;j++){ nums[i][j]=0; } } scanf("%d%d",&s,&c); for(i=0;i<s;i++){ scanf("%d",&nums[0][i]); } for(i=1;i<s;i++){ for(j=0;j<s+c;j++){ nums[i][j] = nums[i-1][j+1]-nums[i-1][j]; } } for(i=s-1;i>=0;i--){ for(j=1;j<s+c;j++){ nums[i][j]=nums[i][j-1]+nums[i+1][j-1]; } } for(i=s;i<s+c;i++){ printf("%d ",nums[0][i]); } cout<<endl; } system("pause"); }