题目地址
题目大意
给你一个序列,让你找出规律并给出接下来得c项
解题思路
使用差分,也就是不断地求相邻两项之间的差,一直到其所有的差值都相同为止,这个时候在返回去就会得到原序列。
例如题中的例三:
1 1 1 1 1 1 1 1 1 2 11 56
0 0 0 0 0 0 0 0 1 9 45
0 0 0 0 0 0 0 1 8 36
0 0 0 0 0 0 1 7 28
0 0 0 0 0 1 6 21
0 0 0 0 1 5 15
0 0 0 1 4 10
0 0 1 3 6
0 1 2 3
1 1 1
这样就能更加直观的看出来本题使用差分来求解了。
具体操作的时候,不会直接去判断什么时候全相等了,而是直接给它减到最后,统一操作就行。使用一个二维数组进行模拟。
AC代码
#include <iostream>
using namespace std;
int num[110][110];
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
for (int i=0; i<n; i++)
cin >> num[0][i];
for (int i=1; i<n; i++)
{
for (int j=0; j<n-i; j++)
num[i][j] = num[i-1][j+1] - num[i-1][j];
}
for (int i=1; i<= m; i++)
num[n-1][i] = num[n-1][0];
for (int i=n-2; i>=0; i--)
{
for (int j=n-i; j<n+m; j++)
{
num[i][j] = num[i][j-1] + num[i+1][j-1];
}
}
int flag = false;
for (int i=n; i<n+m; i++)
{
if (flag)
cout << " ";
flag = true;
cout << num[0][i];
}
cout << endl;
}
return 0;
}