#include #include using namespace std; int main(void){ /* 1 ~ 10^p から (A)3の倍数 および (B)3の付く数の個数 を求めるプログラム。 ベン図で考えて (A) + (B) - (A)かつ(B) で求めることにした */ // 入力 unsigned long long p = 0; cin >> p; // 結果 unsigned long long result1 = 0; unsigned long long result2 = 0; unsigned long long result3 = 0; // (A)3の倍数 // p1=3, p2=33, p3=333, ... を一般化すると // A(p) = (unsigned long long)(powl(10, p) / 3) result1 = (unsigned long long)(powl(10, p) / 3); // (B)3の付く数 // p1=1, p2=19, ... を一般化すると // A(1) = 1 // A(p) = A(p-1) * 9 + powl(10, p-1) for (int i = 1, init = 1; i <= p; i++) { if (i == 1) { result2 = init; } else { result2 = init * 9 + (unsigned long long)powl(10, p - 1); init = result2; } } // (A)かつ(B) // p1=1, p2=7, ... を一般化すると // A(1) = 1 // A(p) = A(p) * 3 + (A(p-1) - 1) * 6 + (unsigned long long)(powl(10, p) / 3) + 1 for (int i = 1, init = 1; i <= p; i++) { if (i == 1) { result3 = init; } else { result3 = init * 3 + (init - 1) * 6 + (unsigned long long)(powl(10, p) / 3) + 1; init = result3; } } // 出力 printf("%llu", result1 + result2 - result3); }