HNOI 2008脱獄
入力
出力
例
ヒント
この質問は、いくつかの数学なしでは本当に簡単ではありません。まず、隣接する種は少ないと思いますが、明らかに複雑すぎます。逆も考えられます。隣接していないものを計算する場合は、隣接していないものを差し引きます。
合計の数は、乗算の原理によってm nとして知られています(乗算の原理、最初の位置にはm種類の選択肢があり、2番目の位置にはm種類あり、合計でm * m * ...... m種類、いくつかあります数mを掛けると、
その質問の反対は、最初の位置にmの可能性があること、2番目の位置と異なる場合はm-1の可能性があること、2番目の位置と異なる3番目の位置にm-1の可能性があることです。 、したがって、問題の反対側の数(同じではない)はm *((m-1)(n-1))です。
合計から質問のマイナス側を差し引くだけです。
この質問は、肯定的であることを確認するために、最終的に否定的である可能性があることに注意してください。データが大きく、高速な電力を使用します。
コードは次のとおりです。
1 #include <iostream> 2 #include <cstdio> 3 名前空間std を使用 。 4 typedef long long ll; 5 const int mod = 100003 ; 6 ll fpow(ll x、ll y)// 快速幂7 { 8 ll res = 1 ; 9 while (y) 10 { 11 if(y&1 ) 12 { 13 res = res * x%mod; 14 } 15 x = x * x%mod; 16 y >> = 1 ; 17 } 18 リターン RES%のMOD。 19 } 20 int main() 21 { 22 ll n、m; 23 cin >> m >> n; 24 ll an; 25 ans =(fpow(m、n)-m * fpow((m- 1)、(n- 1)))%mod; 26 if(ans < 0)// 可能性は负 27 { 28 ans + = mod; 29 ans%=モッド; 30 } 31 cout << ans; 32は 0を返し ます。 33 }