题目链接:http://acm.hust.edu.cn/problem.php?id=1025
Consider the special sequence of numbers, which satisfies the following requirements:
a[0] = 0;
a[1] = 1;
for every i = 1, 2, 3, ...
a[2*i] = a[i];
a[2*i+1] = a[i] + a[i+1];
Your task is easy, write a program which for a given value of N (0 < N < 1018) finds the Nth number of the sequence.
Input
Only one number N.
Output
For every N in the input write the Nth number of the sequence.
题目比较吓人
直接写递归函数单个数据其实很快的
用map记录下已经计算出来的数字,减少一切重复计算
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
#define LL long long
map<LL,LL> m;
LL find_ans(LL now){
if(now<=1) return now;
LL a,b,c=now>>1;
a=m[c];
if(a==0) {
a=find_ans(c);
m[c]=a;
}
if(now%2==0) return a;
else{
c++;
b=m[c];
if(b==0) {
b=find_ans(c);
m[c]=b;
}
return a+b;
}
}
int main(){
int i,j,k;
LL now;
while(scanf("%lld",&now)!=EOF){
printf("%lld\n",find_ans(now));
}
return 0;
}