配点 : 600 点
問題文
1 以上 N 以下の整数からなる長さ N の数列 A=(A1,A2,…,AN) および整数 i (1≤i≤N) に対して、
長さ 10100 の数列 Bi=(Bi,1,Bi,2,…,Bi,10100) を以下のように定義します。
- Bi,1=i
- Bi,j+1=ABi,j (1≤j<10100)
また、Si を「数列 Bi のなかでちょうど 1 度だけ出てくる数の種類数」と定義します。
より厳密には、Si は「Bi,j=k を満たす j (1≤j≤10100) がちょうど 1 つであるような k の数」です。
整数 N が与えられます。数列 A として考えられるものは NN 通りありますが、それら全てに対して i=1∑NSi を求め、
その総和を M で割った余りを答えてください。
制約
- 1≤N≤2×105
- 108≤M≤109
- N,M は整数
入力
入力は以下の形式で標準入力から与えられる。
N M
出力
答えを整数として出力せよ。
4 100000000
624
例として、A=(2,3,3,4) の場合を考えます。
- i=1 のとき : B1=(1,2,3,3,3,…) となるから、1 度だけ出てくる数は 1,2 の 2 つで、S1=2
- i=2 のとき : B2=(2,3,3,3,…) となるから、1 度だけ出てくる数は 2 のみで、S2=1
- i=3 のとき : B3=(3,3,3,…) となるから、1 度だけ出てくる数は存在せず、S3=0
- i=4 のとき : B4=(4,4,4,…) となるから、1 度だけ出てくる数は存在せず、S4=0
よって、i=1∑NSi=2+1+0+0=3 です。
他の 255 通りの A に対しても同様に i=1∑NSi を計算したうえで、
256 通り全ての総和をとると 624 になります。
7 1000000000
5817084
2023 998244353
737481389
総和を M で割った余りを出力してください。
100000 353442899
271798911