长春理工大学第十四届程序设计竞赛(重现赛)H.Arithmetic Sequence

题意:

数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分。

你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列。这样,只要他精通了等差数列,他就能做出任何数列题目。

等差数列是数列的一种。在等差数列中,任何相邻两项的差相等,该差值称为公差。例如数列3,5,7,9,11,13,3,5,7,9,11,13,⋯就是一个等差数列。 在这个数列中,从第二项起,每项与其前一项之差都等于2,即公差为2。

小r熟知等差数列的各种公式:如果一个等差数列的首项标为a1a1,公差标为d,那么该等差数列第n项的表达式为

an=a1+(n1)dan=a1+(n−1)d

等差数列的任意两项之间存在关系

an=am+(nm)dan=am+(n−m)d

和为SnSn,首项a1a1,末项 anan,公差d,项数n,同时可得

Sn=a1+a2+a3++an=n1i=0(a1+id)=n(a1+an)2=n[2a1+(n1)d]2Sn=a1+a2+a3+⋯+an=∑i=0n−1(a1+id)=n(a1+an)2=n[2a1+(n−1)d]2

为什么他这么熟练呢?因为小r在小时候就发现这个公式了。在他三年级的时候,他的老师让学生们做从1加到100的习题。小r很快发现数列的规律,用上面的公式得出了5050的答案。于是小r在后来编写你的教科书的时候,经常把如上公式写成一个等差数列的和等于其首项与末项的和乘以项数除以2。

顺便一提,小r在证明上面的公式时,使用了自创的伪证法,先做假设再证明,为世人所称道:

先证n=1时该公式成立:等式左边=a1=a1,等式右边=a1+a12=a1=a1+a12=a1(需注意在此时首项和末项均为a1a1),两边相等,得证。

再假设n=k时该公式成立,有Sk=(a1+ak)k2=[2a1+(k1)d]k2Sk=(a1+ak)k2=[2a1+(k−1)d]k2。

现在证明n=k+1时该公式成立:

Sk+1=Sk+ak+1=(2a1+(k1)d)k2+a1+kdSk+1=Sk+ak+1=(2a1+(k−1)d)k2+a1+kd

=2a1k+2a1+k2d+kd2=(2a1+kd)(k+1)2=(a1+ak+1)(k+1)2 因为=2a1k+2a1+k2d+kd2=(2a1+kd)(k+1)2=(a1+ak+1)(k+1)2,

ak+1=a1+kd,所以,得证。 看到这里,你不由得发出赞叹:为什么小r这么强呢? 然而,强如小r,是不屑于计算一些琐碎的计算的。现在小r给了你一个数X,要求你搞出一个等差数列a使得 ak+1=a1+kd

Sn=a1+a2+a3++an=n1i=0(a1+id)=n(a1+an)2=X

思路:

做出等差数列,只需做出1项的等差数列即可。

代码:

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    cout << 1 << endl;
    cout << n << endl;
    return 0;
}

  

posted @ 2019-06-08 23:44  YDDDD  阅读(169)  评论(0编辑  收藏  举报