51nod 1387 移数字

题目描述:

真姬和妮可正在玩游戏增进感情,这个游戏时这样的:
   
开始有一个长度为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)是一样的(这是因为构造出来的式子在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值