問題描述
蒜頭君有 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...