题目描述:
真姬和妮可正在玩游戏增进感情,这个游戏时这样的:
开始有一个长度为n的排列,每次可以把第三个数移到排列的最前面(例如把"1 2 3 4 5"变成"3 1 2 4 5"),或者把最后一个数移到排列的最前面(例如把"1 2 3 4 5"变成"5 1 2 3 4")。目标是把排列从小到大排序。她们玩了很久之后发现一些数列可以达成目标,而其他的一些不行。于是她们就想知道长度为n的排列有多少个是可以满足条件的。输出结果Mod P。
收起
输入
第一行两个整数n,p。 (3 ≤ n ≤ 10^9, p = a × 2^b + 1, a > 0, b ≥ 16,保证 a, b 均为整数, p 是一个质数且 p ≤ 2 × 10^9)
输出
仅一行一个整数,表示答案。
输入样例
3 907018241
输出样例
3
回来拉模版的时候意外发现这个题还没写题解,所以就随便补点吧。
题意其实就是要你求n的阶乘在模意义下的值。
首先找出来一个最大的mm满足m2<=nm2<=n,对于大于m2m2部分的数我们直接暴力求就行了,问题是求m2m2以内的答案。
先构造一个多项式f(x)=(x+1)(x+2)(x+3)……(x+m)f(x)=(x+1)(x+2)(x+3)……(x+m),然后求它在x=0、x=m……x=m(m−1)x=0、x=m……x=m(m−1)位置的值,然后求个值全部乘起来就行了。
稍微说下怎么做多点求值,构造两个多项式
G1(x)=(x−x1)(x−x2)……(x−x⌊m2⌋)=x(x−m)……(x−⌊m2⌋m)G1(x)=(x−x1)(x−x2)……(x−x⌊m2⌋)=x(x−m)……(x−⌊m2⌋m)
G2(x)=(x−x⌊m2⌋+1)……(x−xm)=(x−⌊m2⌋m−m)……(x−m2+m)G2(x)=(x−x⌊m2⌋+1)……(x−xm)=(x−⌊m2⌋m−m)……(x−m2+m)
然后拿f(x)f(x)对G1(x)G1(x)取模得到一个⌊m2⌋⌊m2⌋次的多项式,这个多项式在x1、x2……x⌊m2⌋x1、x2……x⌊m2⌋位置的值跟f(x)f(x)是一样的(这是因为构造出来的式子在