5 sao đuy Năm ngoái Conan chỉ mới bước vào học Tin học thật sự. Thế nhưng anh ta bị đàn em là Như Quỳnh thách đố bài toán sau: Cho T≤105 dòng. Mỗi dòng của T có 1 số N (N≤105). Dãy số A được xây dựng như sau: A[0]=0 A[1]=1 A[2i]=A[i] A[2i+1]=A[i]+A[i+1] Yêu cầu: Nhiệm vụ của bạn là tìm số lớn nhất của dãy A từ 1 với N. Dữ liệu vào Dòng đầu tiên là số T. T dòng sau, mỗi dòng là 1 số N. Kết quả Có T dòng tương ứng với giá trị lớn nhất của các đoạn. Sample Input 2 5 10 Sample Output 3 4

1 câu trả lời

#include <iostream>
using namespace std;

const int maxn = 1e5;
#define ll long long
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
 ll a[maxn + 1],f[maxn + 1];
 a[0] = 0;
 a[1] = 1;
 f[0] = 0;
 ll i;
 for (i = 1;i <= maxn/2;i++)
 {
  a[2*i] = a[i];
  a[i*2 + 1] = a[i] + a[i+1];
 }
 for (i = 1;i <= maxn;i++)
  f[i] = max(f[i-1],a[i]);
 int t;cin >> t;
 while (t--)
 {
  int n;cin >> n;
  cout << f[n] << '\n';
 }
}