HNOI 2008脱獄(組み合わせ数学(乗算の原理)+高速パワー)

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 }

 

おすすめ

転載: www.cnblogs.com/theshorekind/p/12718504.html