首页 > 试题广场 >

涂颜色

[编程题]涂颜色
  • 热度指数:142 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在这个游戏中,有一个 nm 列的方阵,现在要为这个方阵涂上黑白两种颜色。
规定左右相邻两格的颜色不能相同,请你帮它统计一下有多少种涂色的方法。
由于答案很大,你需要将答案对 1000000007 取模。

输入描述:
输入两个数 n, m
数据范围:1 \le n, m \le 10^{100000}


输出描述:
输出总共的方案数。
示例1

输入

2 2

输出

4
/*
规定左右相邻两格的颜色不能相同,一行2种涂色方案,n行就是2的n次方种涂色方案
n已经大到无法用已有数据来存储 2^n只会更大 需要对指数n进行模运算
费马小定理:
a^b  mod MOD = a^( b mod (MOD-1) )  mod MOD(MOD为质数)1e9+7为质数
指数取模的依据:a^(MOD-1) ≡ 1  (mod MOD) 只要MOD是质数,a 的 (MOD−1) 次方 mod MOD,结果一定是 1
*/
#include <iostream>
#include <string>
using namespace std;

int MOD = 1e9+7;

//输入的大整数对 MOD-1 取模
int modexp(string s){
    long long ans=0;
    for(int i=0;i<s.length();i++){
        ans = (ans*10 + s[i]-'0') % (MOD-1);
    }
    return ans;
}

//快速幂对p取模
long long fastpowmod(int base,int exp,int p){
    if(exp==0) return 1;
    long long temp=fastpowmod(base, exp/2, p) % p;
    if(exp%2==0) return temp*temp % p;
    else return base*temp*temp % p;
} //temp 和返回全都要改成 long long 不然数据溢出结果不对

int main() {
    string n;
    cin>>n;
    int exp = modexp(n);
    cout<<fastpowmod(2,exp,MOD);
}

发表于 2026-02-28 19:11:33 回复(0)