原题链接:https://judge.yosupo.jp/problem/montmort_number_mod

Montmort Number

Let aka_k be the number of size kk permutations pp s.t. piip_i \ne i for each ii.
Given N,MN,M. For each i=1,,Ni=1,⋯,N, print bk=akmodMb_k=a_k\mod M.

Constraints

1N1061\le N \le 10^6

1M1091\le M \le 10^9

Input

N M

Output

b1 b2 ... bnb_1 \ b_2\ ...\ b_n

Sample

#1

1
2
10 100
0 1 2 9 44 65 54 33 96 61

#2

1
2
20 998244353
0 1 2 9 44 265 1854 14833 133496 1334961 14684570 176214841 294304226 127281753 910981941 600290115 222488424 11814221 224470198 496426549

题目描述

1...k1...kkk个数,排列这kk个数,共有k!k!中可能,设其中一种排列为pppip_i表示第ii个数的值,aka_k表示满足所有ii的情况下piip_i \ne i的排列的个数;

例如:k=2k=2,共有2!=22!=2种排列,分别为{1,2}\{1,2\}{2,1}\{2,1\},满足piip_i \ne i的排列只有一种,即{2,1}\{2,1\}

输入N,MN,M,对于每一个k=1,,Nk=1,⋯,N,求akmodMa_k \mod M的值

解决方案

a0=1a_0=1,我的理解是,没有东西可以排列的情况有1种,即{}\{\}

a1=0a_1=0,只有{1}\{1\}一种排列,该排列不满足piip_i \ne i

对于aka_k来说,第1个位置的数有k1k-1种可能(即2,3,...,k2,3,...,k之一),假设把ii放在第1个位置,这时有2种选择

  1. 把1放到第ii个位置,这时剩下的k2k-2个位置分别都存在对应的数字,成为了一个子问题,即ak2a_{k-2}
  2. 1不放到第ii个位置,这样便相当于1不能放在第ii个位置,相当于一个k1k-1个数的子问题,即ak1a_{k-1}

因此

{a0=1,a1=0,ak=(k1)(ak1+ak2),k2\left\{ \begin{array}{lr} a_0=1 , \\ a_1=0 , \\ a_k=(k-1)*(a_{k-1}+a_{k-2}) , & k\ge 2 \end{array} \right.

时间复杂度

O(n)O(n)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main() {
int n,m;
while(cin>>n>>m) {
vi f(n+1, 0);
a[0] = 1; a[1] = 0;
cout << 0;
rep(k,2,n+1) {
a[k] = ((ll)(k-1) * (a[k-1] + a[k-2])) % m;
cout << " " << f[k];
}
cout << endl;
}
}