注意点:开long long
#include <bits/stdc++.h>
using namespace std;
const long long int N = 45;
long long int n, i;
long long int coin[N], gold[N];
long long int f(long long int n, long long int i) // 求到第n级硬币塔
{
if (i == 0) // 0层
return 0;
if (n == 0)
return 1; // 0级
if (i <= 1)
return 0; //<=1层
if (i <= coin[n - 1] + 1) // 在下面的k-1级硬币塔中
return f(n - 1, i - 1);
if (i <= coin[n - 1] + 1 + n) // 在中间n个金币中
return gold[n - 1] + i - coin[n - 1] - 1;
if (i <= 2 * coin[n - 1] + 1 + n) // 在上面的k-1级硬币塔中
return gold[n - 1] + n + f(n - 1, i - coin[n - 1] - n - 1);
return gold[n]; // i大于硬币塔层数
}
int main()
{
cin >> n >> i;
// coin[k]=2*coin[k-1]+k+2 可以看成5层
// gold[k]=2*gold[k-1]+k
// gold[0]=1;
coin[0] = gold[0] = 1;
for (long long int k = 1; k <= n; k++)
{
coin[k] = 2 * coin[k - 1] + k + 2;
gold[k] = 2 * gold[k - 1] + k;
}
cout << f(n, i);
return 0;
}