D - Christmas
問題
非負整数が与えられる。2つの文字に対して、N番目の文字列を
とする。
下から文字に含まれる文字の数を求めよ。
beta.atcoder.jp
解法
・各に対しての数と含まれるすべての文字の数を定義に従って前計算する。
・再帰関数で含まれる文字数を計算することができる。
・のとき、のうち下半分のと中間のは完全に答えに含まれる。
・残った数、つまりの場合との場合はわからないので次数を下げて投げる。
・のときはこれ以上次数を下げることができない。定義からレベル0はPのみで構成されるので、xが0より大きい場合のみ1を返す。
・これすき、今度はコンテスト中にときたい。
#include<bits/stdc++.h> using ll = long long; #define int ll using namespace std; signed main(){ vector<int>dp(51,1LL),dp2(51,1LL); int n,x; cin >> n >> x; for(int i = 1; i < dp.size();++i){ dp[i] = dp[i-1] + dp[i-1] + 3; dp2[i] = dp2[i-1] + dp2[i-1] + 1; } function<int(int,int)>cal = [&](int i,int x) -> int{ if(x == 0){ return 0; } if(i == 0){ return x > 0;} return (x >= dp[i-1] + 2 ? dp2[i-1] + 1 + cal(i-1,x-dp[i-1]-2) : cal(i-1,x-1)); }; cout << cal(n,x) << endl; }