題意:給一個 行 列的方陣上色,只能上黑色或者白色,且必須滿足左右相鄰的格子顏色不能相同,問有多少種上色的方法。
思路:可以得出一行只有兩種上色方法,而相鄰兩行之間互不影響,所以答案就是 。
解法一:
由於 範圍過大,可以通過歐拉降冪來減小時間複雜度。
歐拉降冪:
由於 ,所以 爲質數,質數 的歐拉函數 爲 。降冪後再通過快速冪即可求解。
#-*-coding:utf-8 -*-
n ,m = map(int ,input().split(" "))
p = 1000000007
n = n % (p - 1) + p - 1
a = [0]*12
b = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
len = -1
while n > 0:
len += 1
a[len] = n % 10
n = n // 10
ans = 1
for i in range(len):
ans = ans * b[a[len - i]] % p
ans = pow(ans ,10) % p
ans = ans * b[a[0]] % p
print(ans)
解法二:
因爲是模數 是質數,所以也可以用費馬小定理來進行降冪。
費馬小定理: ( 爲質數)
代碼同解法一是一樣的
解法三:
c++直接用十進制快速冪
十進制快速冪:
設
則
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const long long p = 1e9 + 7;
string a, b;
int num[10] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
long long ans, x;
int main()
{
cin >> a >> b;
ans = 1;
int len = a.size() - 1;
for (int i = 0; i < len; ++i)
{
(ans *= num[a[i] - '0']) %= p;
x = ans;
for (int j = 2; j <= 10; ++j)
(ans *= x) %= p;
}
(ans *= num[a[len] - '0']) %= p;
printf("%lld\n", ans);
return 0;
}