fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. struct BigInt {
  12. static const int BASE = 1e9;
  13. static const int B = 9;
  14.  
  15. vector<int> a;
  16.  
  17. BigInt() {}
  18.  
  19. BigInt(ll x) {
  20. for (; x > 0; x /= BASE) {
  21. a.push_back(x % BASE);
  22. }
  23. }
  24.  
  25. BigInt(const string &s) {
  26. for (int i = (int)s.size() - 1; i >= 0; i -= B) {
  27. int beg = max(0, i - B + 1);
  28. int len = i - beg + 1;
  29. int block = stoi(s.substr(beg, len));
  30. a.push_back(block);
  31. }
  32. trim();
  33. }
  34.  
  35. void trim() {
  36. while (!a.empty() && a.back() == 0) {
  37. a.pop_back();
  38. }
  39. }
  40.  
  41. bool isZero() {
  42. return (a.empty());
  43. }
  44.  
  45. BigInt operator+=(const BigInt &other) {
  46. int n = a.size(), m = other.a.size();
  47. int carry = 0;
  48. for (int i = 0; i < max(n, m) || carry; i++) {
  49. if (i == a.size()) {
  50. a.push_back(0);
  51. }
  52. a[i] += (i < m ? other.a[i] : 0) + carry;
  53. carry = (a[i] >= BASE);
  54. if (carry) a[i] -= BASE;
  55. }
  56. return *this;
  57. }
  58.  
  59. BigInt operator+(const BigInt &other) const {
  60. return BigInt(*this) += other;
  61. }
  62.  
  63. friend istream& operator>>(istream &in, BigInt &num) {
  64. string s;
  65. in >> s;
  66. num = BigInt(s);
  67. return in;
  68. }
  69.  
  70. friend ostream& operator<<(ostream &out, const BigInt &num) {
  71. out << (num.a.empty() ? 0 : num.a.back());
  72. for (int i = (int)num.a.size() - 2; i >= 0; i--) {
  73. out << setw(B) << setfill('0') << num.a[i];
  74. }
  75. return out;
  76. }
  77. };
  78.  
  79. const int N = 1e2 + 5;
  80.  
  81. BigInt dp[N]; // dp[i] = Số cách lát các viên gạch khi xét đến cột thứ i
  82.  
  83. // - Để tính dp[i] cho dạng bài kiểu như này thì ta cứ xét qua hết các trường hợp lát gạch
  84. // sao cho lấp đầy được cột i, nhằm đưa về bài toán nhỏ hơn với các cột ở trước
  85. // - Cụ thể trong bài này thì sẽ có 2 trường hợp:
  86. // TH1: Lấp đầy cột i bằng 1 viên gạch kích thước 2 * 1
  87. // => Đưa về bài toán với i - 1 cột ở trước
  88. // => dp[i - 1]
  89. // TH2: Lấp đầy cột i và cột i - 1 bằng 2 viên gạch kích thước 1 * 2
  90. // => Đưa về bài toán với i - 2 cột ở trước
  91. // => dp[i - 2]
  92.  
  93. void precompute() {
  94. dp[0] = dp[1] = 1;
  95. for (int i = 2; i < N; i++) dp[i] = dp[i - 1] + dp[i - 2];
  96. }
  97.  
  98. int main() {
  99. ios::sync_with_stdio(false);
  100. cin.tie(nullptr);
  101. int t; cin >> t;
  102.  
  103. precompute();
  104.  
  105. while (t--) {
  106. int n; cin >> n;
  107. cout << dp[n] << '\n';
  108. }
  109. }
  110.  
Success #stdin #stdout 0.01s 5296KB
stdin
3
1
2
3
stdout
1
2
3