Advertisement
MiinaMagdy

10198 - Counting

Aug 3rd, 2023
1,143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i,n) for (int i = 0, _n = (n); i < _n; i++)
  6. #define repr(i,n) for (int i = (n) - 1; i >= 0; i--)
  7. #define int64 long long
  8. #define pb push_back
  9.  
  10.  
  11. struct BigInteger {
  12.     static const int BASE = 1000000000; // 10^9
  13.    
  14.     vector<int64> digits;
  15.    
  16.     BigInteger() {
  17.         digits.clear();
  18.         digits.pb(0);
  19.     }
  20.     BigInteger(int64 number) {
  21.         digits.clear();
  22.         do {
  23.             digits.pb(number % BASE);
  24.             number /= BASE;
  25.         } while (number);
  26.     }
  27.    
  28.     BigInteger operator + (const BigInteger &b) const {
  29.         BigInteger res = BigInteger();
  30.         res.digits.resize(max(b.digits.size(), digits.size()));
  31.         int64 remainder = 0;
  32.         rep(i, res.digits.size()) {
  33.             if (i < int(digits.size())) remainder += digits[i];
  34.             if (i < int(b.digits.size())) remainder += b.digits[i];
  35.             res.digits[i] = remainder % BASE;
  36.             remainder /= BASE;
  37.         }
  38.         while (remainder) {
  39.             res.digits.pb(remainder % BASE);
  40.             remainder /= BASE;
  41.         }
  42.         return res;
  43.     }
  44.    
  45.     BigInteger operator * (const BigInteger &b) const {
  46.         BigInteger res = BigInteger();
  47.         res.digits = vector<int64>(b.digits.size() + digits.size() - 1, 0);
  48.         rep(i, digits.size()) rep(j, b.digits.size())
  49.             res.digits[i + j] += digits[i] * (int64)b.digits[j];
  50.         int64 remainder = 0;
  51.         rep(i, res.digits.size()) {
  52.             remainder += res.digits[i];
  53.             res.digits[i] = remainder % BASE;
  54.             remainder /= BASE;
  55.         }
  56.         while (remainder) {
  57.             res.digits.pb(remainder % BASE);
  58.             remainder /= BASE;
  59.         }
  60.         return res;
  61.     }
  62.    
  63.     void print() {
  64.         printf("%lld", digits.back());
  65.         repr(i, (int)digits.size() - 1) printf("%09lld", digits[i]);
  66.     }
  67.    
  68.     static BigInteger power(const BigInteger &b, int64 k) {
  69.         if (k == 0) return BigInteger(1);
  70.         if (k == 1) return b;
  71.         BigInteger res = power(b, k / 2);
  72.         res = res * res;
  73.         if (k & 1) return res * b;
  74.         return res;
  75.     }
  76. };
  77.  
  78. BigInteger dp[1001][1001];
  79. bool cached[1001][1001];
  80.  
  81. BigInteger solve(const int &n, int idx, int sum) {
  82.     if (sum <= 0) {
  83.         return BigInteger(sum == 0);
  84.     }
  85.     BigInteger &ret = dp[idx][sum];
  86.     if (cached[idx][sum])
  87.         return ret;
  88.    
  89.     ret = 0;
  90.     for (int i = 1; i <= 4; i++) {
  91.         ret = ret + solve(n, idx + 1, sum - ((i - 1) % 3 + 1));
  92.     }
  93.     cached[idx][sum] = true;
  94.     return ret;
  95. }
  96.  
  97. int main() {
  98.     int n;
  99.     while (scanf("%d", &n) != EOF) {
  100.         BigInteger ans = solve(n, 0, n);
  101.         ans.print();
  102.         puts("");
  103.     }
  104.     return 0;
  105. }
  106.  
Tags: UVA DP digits
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement