codeforces round#372(div2 C) C. Plus and Square Root

54 篇文章 0 订阅
C. Plus and Square Root

ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ' + ' (plus) and '' (square root). Initially, the number 2 is displayed on the screen. There aren + 1 levels in the game and ZS the Coder start at the level1.

When ZS the Coder is at level k, he can :

  1. Press the ' + ' button. This increases the number on the screen by exactlyk. So, if the number on the screen was x, it becomes x + k.
  2. Press the '' button. Let the number on the screen be x. After pressing this button, the number becomes. After that, ZS the Coder levels up, so his current level becomesk + 1. This button can only be pressed whenx is a perfect square, i.e.x = m2 for some positive integerm.

Additionally, after each move, if ZS the Coder is at level k, and the number on the screen is m, thenm must be a multiple ofk. Note that this condition is only checked after performing the press. For example, if ZS the Coder is at level4 and current number is 100, he presses the '' button and the number turns into 10. Note that at this moment,10 is not divisible by 4, but this press is still valid, because after it, ZS the Coder is at level5, and 10 is divisible by5.

ZS the Coder needs your help in beating the game — he wants to reach level n + 1. In other words, he needs to press the '' buttonn times. Help him determine the number of times he should press the ' + ' button before pressing the '' button at each level.

Please note that ZS the Coder wants to find just any sequence of presses allowing him to reach leveln + 1, but not necessarily a sequence minimizing the number of presses.

Input

The first and only line of the input contains a single integer n (1 ≤ n ≤ 100 000), denoting that ZS the Coder wants to reach leveln + 1.

Output

Print n non-negative integers, one per line.i-th of them should be equal to the number of times that ZS the Coder needs to press the ' + ' button before pressing the '' button at level i.

Each number in the output should not exceed 1018. However, the number on the screencan be greater than 1018.

It is guaranteed that at least one solution exists. If there are multiple solutions, print any of them.

Examples
Input
3
Output
14
16
46
Input
2
Output
999999999999999998
44500000000
Input
4
Output
2
17
46
97
Note

In the first sample case:

On the first level, ZS the Coder pressed the ' + ' button14 times (and the number on screen is initially 2), so the number became 2 + 14·1 = 16. Then, ZS the Coder pressed the '' button, and the number became .

After that, on the second level, ZS pressed the ' + ' button16 times, so the number becomes 4 + 16·2 = 36. Then, ZS pressed the '' button, levelling up and changing the number into .

After that, on the third level, ZS pressed the ' + ' button46 times, so the number becomes 6 + 46·3 = 144. Then, ZS pressed the '' button, levelling up and changing the number into .

Note that 12 is indeed divisible by 4, so ZS the Coder can reach level 4.

Also, note that pressing the ' + ' button 10 times on the third level before levelling up does not work, because the number becomes6 + 10·3 = 36, and when the '' button is pressed, the number becomes and ZS the Coder is at Level4. However, 6 is not divisible by4 now, so this is not a valid solution.

In the second sample case:

On the first level, ZS the Coder pressed the ' + ' button999999999999999998 times (and the number on screen is initially2), so the number became 2 + 999999999999999998·1 = 1018. Then, ZS the Coder pressed the '' button, and the number became .

After that, on the second level, ZS pressed the ' + ' button44500000000 times, so the number becomes 109 + 44500000000·2 = 9·1010. Then, ZS pressed the '' button, levelling up and changing the number into .

Note that 300000 is a multiple of 3, so ZS the Coder can reach level 3.


题意:最开始给你一个数字x = 2,有两种操作,第一种是 + 操作, 每操作一次可以让x + 一次k,可以操作无数次,k为当前等级,k的等级最开始为1,第二种操作是开方,即把x开方,开方之后,你的等级k就会上升一个等级,即k++;并且这时候你开方得到的数字必须是k+1之后的倍数 ,要让自己的等级k == n + 1,问你每上升一级,要按多少次 +;


思路:知道题意之后就比较简单了,看样例的时候手写算一下,最后一个样例很好

开始是2,+2后,变成4,开方变成2,等级为2, 2/2 = 1

然后2 + 17*2 = 36,开方后变成6 等级为3,  6/3 = 2

然后6 + 46 * 3 = 144,开方后变成12 等级为4   12/4 = 3

然后12 + 97*4 = 400 开方后变成20 等级为5,  20/5 = 4

你会发现,开方之后的数字都是k+1的k倍,或者说成1,2,3,4、、、递增的倍数比较好理解,就是拿到这道题,先想倒着推,知道k+1,求开方之后的数,只需要乘上任意一个数就行,那就乘以自身等级的(因为他是从1开始,并且也都可以用k表示)所以开方后的x就是k*(k+1),平方就是的x,那个x又是由+k的总值(k*+的次数),跟前面那个x开方之后的数的和,前面x开方的和怎么求?现在的是k*(k+1),前面的不就是k-1,(k-1)*k了,所以式子就出来了。。。((k*(k+1))%^2 - k*(k-1))/k;

所以直接循环到n就出结果了。。。。注意用long long存;


#include <iostream>
using namespace std;
int main()
{
    long long n;
    cin >> n;
    cout << 2 << endl;
    for(long long i = 2; i <= n; i++)
        cout << i*(i+1)*(i+1) - (i-1) << endl;   //这里一定要化简一下,否则会无故wa。。可能是精度损失?
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值