Niu Ke—ハッピーブラッシング
トピックリンク:ハッピーペインティング
題名
n個のグリッドとm個の色があります。同じ色の2つの隣接するグリッドの一致する数を見つける必要があります。
問題解決のアイデア
コーティング方法がいくつあるかを理解するには、明らかにmnm ^ {n}です。mnの場合、隣接する色が異なるすべてのコーティング方法を見つければ、同じ色の隣接するグリッドが2つあることを示すことができます。
隣接するグリッドの色を表現するにはどうすればよいですか?最初のグリッドに任意の色を選択できるのは非常に簡単です。2番目のグリッドの色が前のグリッドの色と異なる場合は、(m-1)色しか選択できません。合計n *(m − 1)n − 1(m-1)^ {n-1}(m−1 )N - 1つのコーティング方法。
次に、高速電力を使用してmnm ^ {n}を計算できます。mn、(m − 1)n − 1(m-1)^ {n-1}(m−1 )N - 1。
コードをアップロード
#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;
}