まず最初に思い付くのは、 を求めてから で割る、という方法でしょう。しかし、制約より なのでC++などの言語では変数の値は確実にオーバーフローしますし、Pythonのような数値を可変長配列として保持するような言語でもの値の計算に時間がかかってしまいTLEします。 また、 を のように分解して逐次 で割った値を足していくという方法も考えられますが、こちらもの値が大きいため計算に時間がかかりTLEします。そこで、次のように考えてみます。
を のように分解して考えるというところまでは同じです。ここで、 を「初項 , 公比 の等比数列の和」として考えると、 となります。ここで、 を で割った余りは繰り返し二乗法を用いて で計算できるので、答えとなる を で割った余りも逆元計算を用いて適切に計算することで時間計算量 で計算できます。コンピューターは一秒に 回の計算ができるため、 本制約においては余裕を持って実行時間制限に間に合います。 よって、この問題を解くことができました。