Niu Ke - Happy Brushing
Link do tópico: Happy painting
Título
Existem n grades em cores M. É necessário descobrir o número correspondente de duas grades adjacentes com a mesma cor.
Ideias para resolução de problemas
Para entender quantos métodos de revestimento existem, é obviamente mnm ^ {n}mn , então, enquanto você encontrar todos os métodos de revestimento com cores adjacentes diferentes, poderá mostrar que há duas grades adjacentes com a mesma cor.
Como expressar a cor de qualquer grade adjacente? É muito simples que você pode escolher qualquer cor para a primeira grade, e se a cor da segunda grade for diferente daquela da grade anterior, existem apenas (m-1) cores para escolher, e assim por diante, um total de n *(m - 1) n - 1 (m-1) ^ {n-1}( m-1 )n - 1 método de revestimento.
Então você pode usar a potência rápida para calcularmnm ^ {n}mn ,(m - 1) n - 1 (m-1) ^ {n-1}( m-1 )n - 1 .
Código de upload
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
ll fastpow(ll a , ll n){
ll res = 1, base = a % mod;//这里一定要取mod因为m可能会大于mod
while(n){
if(n & 1)
res = (res * base) % mod;
base = (base * base) % mod;
n >>= 1;
}
return res;
}
int main(){
ll n, m, x, y, ans;
cin >> n >> m;
x = fastpow(m, n) % mod;
y = (m % mod * fastpow(m - 1, n - 1)) % mod;
if(x - y > 0)//因为取mod了,所以有可能x < y ,小于的话加一个mod就ok
ans = (x - y) % mod;
else
ans = (x - y + mod) % mod;
cout << ans << endl;
return 0;
}