#include using namespace std; using LL = long long; LL a[101]; // 数列の項番を分解して, 元の数列の値を, 再帰的に計算. // @param X: 数列の項番. // @return ret: 数列の値. LL recursive(LL X){ // 1. 引数X を 3, 5 で割る. LL ret = 0; LL x3 = X / 3, x5 = X / 5; // 2. X が 0 なら処理終了. // -> in02.txt で, 2 と出力されて, WA となったため ロジック追加. if(X == 0) return 1; // 3. x3, x5 の 値が, 100以下となっていたら, 処理終了. if(x3 <= 100 && x5 <= 100) return (a[x3] + a[x5]); // 4. 2. 以外の場合は, 再帰処理. if(x3 <= 100 && x5 > 100){ ret = a[x3] + recursive(x5); return ret; } if(x3 > 100 && x5 <= 100){ ret = recursive(x3) + a[x5]; return ret; } return (recursive(x3) + recursive(x5)); } int main() { // 1. 入力情報取得. LL N; scanf("%llu", &N); // 2. 数列を設定. for(int i = 0; i < 101; i++){ if(i == 0) a[i] = 1; if(i >= 1 && i <= 2) a[i] = 2; if(i >= 3 && i <= 4) a[i] = 3; if(i >= 5 && i <= 8) a[i] = 4; if(i >= 9 && i <= 14) a[i] = 5; if(i >= 15 && i <= 24) a[i] = 7; if(i >= 25 && i <= 26) a[i] = 8; if(i >= 27 && i <= 44) a[i] = 9; if(i >= 45 && i <= 74) a[i] = 12; if(i >= 75 && i <= 80) a[i] = 15; if(i >= 81 && i <= 100) a[i] = 16; } // 3. 数列を計算. LL ans = recursive(N); // for(int i = 1; i < 101; i++){ // LL t = recursive(i); // cout << "i=" << i << " t="<< t << endl; // } // 4. 出力. // ex. // 1000000000000000000 // -> 3207281389 で, 791[ms] かかった. printf("%llu\n", ans); return 0; }