//なぜかサンプル合わない #include #include #define int long long using namespace std; int dp[21][3]; //今下からp(>=1)桁目を見ている int func(int p, int mod3) { if (p == 0) { return (mod3 == 0); } if (dp[p][mod3] > 0) { return dp[p][mod3]; } int ret = 0; double eps = 1e-10; for (int i = 0; i < 10; i++) { if (i == 3) { //3が出てきた時点でそれより下は全て世界のほげ。簡単のため、ここで3が出てくる形は全部計算する。 ret += pow(10, (double)p-1) + eps; } else { ret += func(p-1, (mod3+i)%3 ); } } return (dp[p][mod3] = ret); } signed main() { int p; cin >> p; cout << func(p, 0) - 1 << endl; //0を除くので-1する return 0; }