题目

图片说明

思路

题目大意就是n个石墩,m个荷叶,石墩可以站很多青蛙,荷叶只能站一个,青蛙过河后不能回去,青蛙必须按照汉诺塔站在石墩上,求最多的过河青蛙数。

  1. 先假设 n == 0,那就让每个青蛙都在一个荷叶上,初始石墩剩一个青蛙直接过河,能过m+1个青蛙

  2. 然后 n == 1 ,让每个青蛙都在一个荷叶上,初始石墩青蛙跳到河和中间石墩,其他荷叶青蛙跳到河中间石墩,问题就变成 n==0了,所以答案就是 (m+1)* 2

  3. 再分析 n == 3 ,中间石墩假设为 A,B,先让青蛙都跳满荷叶,全部到A上,然后初始石墩青蛙再这样跳满荷叶,再全部到B上,然后A的青蛙跳到荷叶上,再全部跳到B上,这样B上就有(m+1)*2个青蛙了,剩下的问题就变成了 n==1的情况,所以答案就是 4 * (m+1)

  4. (氵牛币) n == 4时,假设中间石墩是 A,B,C,用上面的办法让青蛙跳满A,B,C。然后A的青蛙全部跳到荷叶上,再跳到B上。接下来初始石墩的青蛙跳满荷叶,再跳到A上,然后C石墩的青蛙跳到荷叶上再跳到A上,B石墩青蛙上面一半跳到荷叶上再跳到C上,B石墩剩下的一半跳到荷叶再跳到A上,C上的青蛙跳到荷叶再跳到A上,这样A上就有 4(m+1)个青蛙。接下来的问题就变成了n == 3,所以答案就是 8*(m+1)
    都是在凑字数 然后就没有然后了,规律很明显了,所以 答案就是 (m+1) 图片说明

贴上代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,m;

int main(){
    scanf("%lld%lld",&n,&m);
    printf("%lld\n",(m+1)*(1<<n));
    return 0;
}