問題の意味:既知のX、配列arr [n]は、最大公約数に分母を求めている分子の割合。分子がΣX^ ARR [i]は、X ^Σarr[i]は、アレイがデクリメントされていない配列の分母です。
アイデアは:それは右のアイデアを思い付いたゲームは、WAは、髪の多くを失った多くの詳細を残し自分自身を見つけることが唯一の誰かが書いたコードを見ました。
1.は、それは分子の最低電力が答えに必要とされるかもしれないと考えるのは簡単です
これによりARRに同じ番号が存在すること2.ので、様々な分子が存在する複合発電状況類似アイテムとすることができる、それは完全に、次いで、同様の用語合成ステップ1に進む前に完了しなければなりません。
3.トリックではなく、合併を完了するために必要なすべての項目、および場合のみあれば Xの現在の係数最小項は割り切れできるだけそう現在の項目の数が必要数に対する答えで、マージを継続する必要があります。
特に注目すべきは、次のとおりです。合併の完了は、最も低消費電力の中の分子の数が分母よりも可能性が大きいので、両者の小さい方への答えとして数値を取る必要があります。
コードは以下の通りであります:
書式#include <cstdioを> する#include <iostreamの> 使用して 名前空間はstdを、 const int型の MO = 1E9 + 7 。 int型のx; int型 mpow(長い 長い XX、長い 長いNN){ 長い 長のRES = 1 。 一方、(!NN = 0 ){ 場合(NN&1 ){ RESの =の解像度* XX%のMO。 } NN >> = 1 。 XX = XX * XX%のMO; } リターンのres; } int型のmain(){ int型N; 長い 長い NUM = 0、ARR [ 100010 ]。 scanf関数(" %D%dの"、&N、&x)は、 以下のために(int型 i = 1 ; iが<= N; iは++ ){ scanf関数(" %I64d "、およびARR [I])。 NUM + = ARR [I]。 } のための(int型 i = 1 ; iが<= N; iが++ ){ ARR [I] = num- ARR [I]。 } 以下のために(int型 i = 1 ; iが(N / = < 2); iは++ ){ スワップ(ARR [I]、ARR [N -i + 1 ])。 } int型の合計= 1 。 長い 長いANS; ARR [N + 1 ] = - 1 。 以下のために(int型、I = 2 ; iが= N + < 1 ; iが++ ){ 場合([I] == ARR ARR [I- 1 ]){ 合計 ++ 。 } 他{ 場合(和%X ==0 ){ 和 / = X。 ARR [ --i] ++ ; } 他{ ANS = ARR [I- 1 ]。 破ります; } } } ANS = 分(ANS、NUM)。 printf(" %dの" 、mpow(X、ANS))。 リターン 0 ; }