codeforces715A Plus and Square Root (构造)

来源:互联网 发布:华为 培训 入职 知乎 编辑:程序博客网 时间:2024/06/11 05:42

题意:

初始数为2,初始等级为1,有如下两种操作:

1. 这个数加上当前等级k

2. 这个数开根号,但前提是这个数是完全平方数且开完根号后为下一等级(k+1)的倍数。该操作之后等级+1

要求对于2, ......, n+1等级输出从上一等级到该等级的第一个操作的次数

答案不唯一,输出任一一个即可


类型:

数学构造题


构造方法:

假设当前等级为k,那我们只需要第一种操作到达(k * (k + 1)) ^ 2就可以了,然后第二种操作转换成k * (k + 1)

构造过程可以很容易通过数学归纳法证明,此处简单证明一下:

等级1时需要步数2为特殊情况

设当前等级为k(k >= 2),则当前数字为(k - 1) * k,那么我们一定可以通过第一步操作到达k * k * (k + 1) * (k + 1),

需要次数为k * (k + 1) * (k + 1) - (k - 1)


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;int main() {    LL n; scanf("%I64d", &n);    n++;    LL u = 2;    for (LL i = 2; i <= n; i++) {        LL v = (i - 1) * i * i;        printf("%I64d\n", v - u / (i - 1));        u = (i - 1) * i;    }    return 0;}




0 0