問題一覧 > 通常問題

No.644 G L C C D M

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 53
作問者 : Pulmn / テスター : square1001
4 ProblemId : 1665 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2022-04-25 02:19:48

問題文

以下の条件を満たす (1,2,,N)(1,2,\dots,N) の順列 AA の通り数を求めてください。ただし、この値は非常に大きくなる場合があるので 1,000,000,0071{,}000{,}000{,}007 で割った時の余りを出力してください。

条件:AA に対して次の操作を N1N-1 回行ったとき、A1=MA_1=M が成り立つ。

操作後の数列を BB とします。
操作:数列 BB の長さは (Aの長さ)1( A の長さ) - 1 であり、1i(Aの長さ)11\le i\le (Aの長さ)-1を満たす全ての ii において、  Bi={gcd(Ai,Ai+1)(iが奇数)lcm(Ai,Ai+1)(iが偶数) \begin{aligned}\ B_i=\begin{cases}gcd(A_i,A_{i+1})&(iが奇数) \\ lcm(A_i,A_{i+1})&(iが偶数) \end{cases}\end{aligned} が成り立つ。
   なお、gcd(x,y)gcd(x,y)xxyy の最大公約数、lcm(x,y)lcm(x,y)xxyy の最小公倍数を表す。

入力

NN MM

2N105,1M1092\le N\le 10^5,1\le M\le 10^9

出力

条件を満たす順列 AA の通り数を 1,000,000,0071{,}000{,}000{,}007 で割った時の余りを出力してください。最後に改行してください。

サンプル

サンプル1
入力
3 1
出力
6

(1,2,3)(1,2,3) の順列すべてが条件を満たします。例えばA={3,1,2}A=\{3,1,2\}の場合、
11回目の操作後:A={gcd(3,1),lcm(1,2)}={1,2}A=\{gcd(3,1),lcm(1,2)\}=\{1,2\}
22回目の操作後:A={gcd(1,2)}={1}A=\{gcd(1,2)\}=\{1\}

サンプル2
入力
2 1
出力
2

サンプル3
入力
3 100
出力
0

(1,2,3)(1,2,3) の順列 AA に対し 22 回操作を行ったとき、常に A1=1A_1=1 が成り立つので、条件を満たす順列は00通りです。

サンプル4
入力
100 30
出力
945719957

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。