1 条题解
-
3
这道题考验找规律的能力。
首先,让我们先观察一下这个数列:
以下是我发现的规律:
-
当该填入的次幂时,以此值为分界线,下一个该填的就是的次幂的次幂之前的值(按从小到大的顺序,这样可以保证当前填入的数值是有序的) 举例: 按上公式,当填入时,之后的几项都是+之前出现过的每一个值:
-
而且,设当前应填入,那么再填入之前,从开始(包括)总共应填入个值(这只是偶然发现,没啥用处)
因此根据规律1,我们能写出如下代码:
while (i <= n) { p.push_back(pow(k , power));//填入k的次幂 i++; power++; int ni = i;//一定要用临时变量存i!!!否则在随着i的增加j永远都小于i - 1!!! for (int j = 0 ; j < ni - 1 ; j++) { p.push_back(p[j] + p[ni - 1]);//依次加上之前的每一个元素 i++;//不要忘! } } printf("%lld" , p[n - 1]);//由于vector下标从0开始,所以要输出p[n - 1]!
:
#include <bits/stdc++.h> using namespace std; int k , n , power = 1; vector<long long> p; int main() { scanf("%d %d" , &k , &n); p.push_back(1); int i = 1; while (i <= n) { p.push_back(pow(k , power)); i++; power++; int ni = i; for (int j = 0 ; j < ni - 1 ; j++) { p.push_back(p[j] + p[ni - 1]); i++; } } printf("%lld" , p[n - 1]); return 0; }
-
- 1
信息
- ID
- 1687
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 23
- 已通过
- 18
- 上传者