二分 快速冪 氣球消消樂

2021-09-21 07:41:25 字數 1019 閱讀 2977

問題描述

蒜頭君有 n 只氣球,蒜頭君把氣球排成一排。初始時,氣球都是白色,現在蒜頭君想用 m 種顏色給氣球塗色,如果相鄰的氣球的顏色相同,這 2 個氣球會發生消消樂,蒜頭君希望你求出會發生消消樂的塗色方法有多少種。最後答案對 10^9+7取模。

輸入格式

輸入兩個整數n(1<=n<=10 ^ 12),m(1<=m<=10^8)

輸出格式

輸出一行表示答案。

樣例輸入

3 4樣例輸出28

這是一題簡單的組合排序問題。

題目要求發生消消樂的塗色方法有多少種 ?我們可以求出不發生消消樂的情況數x,用總的情況數y減去x即可。

很明顯x=m

∗(m−

1)n−

1x = m*(m - 1)^

x=m∗(m

−1)n

−1(第乙個有m種塗法,第乙個往後每乙個有m-1種塗法)。

總數y =m

ny=m^n

y=mn

.即答案為mn−

m∗(m

−1)n

−1

m^n- m*(m - 1)^

mn−m∗(

m−1)

n−1因為n的範圍為10^12所以使用快速冪。

最後注意取模的時候 需要加上乙個mod,要不然會出現負數的情況。

ans = (pow_mod(m, n, mod) - (m * pow_mod(m - 1, n - 1,mod)) % mod + mod) % mod
#includetypedef long long ll;

using namespace std;

const ll mod = 1e9 + 7;

ll pow_mod(ll a, ll n, ll m)

a = (a * a) % m;

n >>= 1;

}return ans % mod;

}int main ()

氣球消消樂 計蒜客(二分快速冪)

蒜頭君有 n 只氣球,蒜頭君把氣球排成一排。初始時,氣球都是白色,現在蒜頭君想用 m 種顏色給氣球塗色,如果相鄰的氣球的顏色相同,這 2 個氣球會發生消消樂,蒜頭君希望你求出會發生消消樂的塗色方法有多少種。最後答案對 10 9 7取模。輸入格式 輸入兩個整數n 1 n 1012 m 1 m 108 ...

二分查詢 快速冪 計蒜客 氣球消消樂2

問題描述 蒜頭君有 n 只氣球,蒜頭君把氣球排成一排。初始時,氣球都是白色,現在蒜頭君想用 m 種顏色給氣球塗色,如果相鄰的氣球的顏色相同,這 2 個氣球會發生消消樂,蒜頭君希望你求出會發生消消樂的塗色方法有多少種。最後答案對 10 9 7取模。輸入輸出 輸入兩個整數n 1 n 10 12 m 1 ...

二分快速冪

在a,b為整數時,若 b很大,如 b 10 25 的時候,我們就要進行優化。如果b是偶數,則可以看作 a b a b 2 2 如果b是奇數,則 a b a b 1 2 2。則有兩種方法,一種遞迴 dfs 一種迴圈,遞迴如下 int dfs int a,int b,int mod int temp d...