2019南昌邀请赛网络赛 H. Coloring Game(简单快速幂)

本文详细解析了一个关于在2*n网格中从左上角到右下角的走法问题,介绍了如何通过动态规划和快速幂算法求解网格走法的数量。提供了完整的代码实现,包括深度优先搜索和快速幂两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

【题面】

【题解】

【代码】


【题面】

Coloring Game

【题解】

题意:给定一个n,在2*n的网格里,从左上角到右下角有多少种走法。可以横着走也可以斜着走。

思路:往回走是没意义的,打表发现走法满足公式:ans=4*3^{n-2} ,快速幂即可。

#include <bits/stdc++.h>
using namespace std;
int sum,n;
void dfs(int x,int y)
{
    if(x<1||x>2||y<1||y>n) return;
    if(x==2&&y==n){
        sum++;
        return;
    }
    dfs(x+1,y);
    dfs(x,y+1);
    dfs(x-1,y+1);
    dfs(x+1,y+1);
}
int main()
{
    while(~scanf("%d",&n)){
        sum=0;
        dfs(1,1);
        printf("%d\n",sum);
    }
    return 0;
}

【代码】

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll quick_pow(ll a,ll b)
{
    ll ret=1;
    while(b){
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b=b/2;
    }
    return ret;
}
int main()
{
    ll n; scanf("%lld",&n);
    ll ans;
    if(n==1) ans=1;
    else ans=(4*quick_pow(3,n-2))%mod;
    printf("%lld\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值