【GDKOI2016】小学生数学题(附带了乘法取模黑科技)

题目描述

给定 n,p,k ,其中 p 是质数。
ni=11i(modpk)
题目保证答案是 PQ 的形式,且 Q1 ,即 Q pk的逆元存在。

npk1018
p105


分析

先考虑所有变量的范围
k70
n1018

类似于求 n!modp 的思路。

ni=11i=1pnpi=11i+0<a<p,a+bpn1a+bp

那么这个式子的计算就分成了两个部分。

part 1

1pnpi=11i(modpk)

假如我们可以处理好 1p 的问题,那么剩下的递归计算就可以了。
考虑计算

npi=11i(modpk+1)

那么由于题目保证了答案逆元存在,所以

1pnpi=11i=npi=11imodpk+1p(modpk)

分子必定含有 p 的因子,具体证明的话,

a=b(modc)ap=bp(modcp)

结合这个式子倒推一下就可以得到了。

part 2

0<a<p,a+bpn1a+bp

现在要处理的就是快速地计算 (a+bp)1
考虑按 a 分组,推导

=napb=01a+bp=napb=011+bpaa(modpk)

考虑 11x=x0+x1+x2+
那么

=napb=0+k=0(bpa)ka=napb=0+i=0(bpa)ia(modpk)

由于括号内那项含 p ,因此当ik时,和式里面的项就为 0 了。
考虑交换枚举顺序,则有

=k1i=0(pa)inapb=0bia(modpk)

问题成功地转化成了自然数幂求和问题,用矩阵乘法处理一下就可以了。

考虑时间复杂度。

T(n,k)=T(np,k+1)+k3+kP

因此总的时间复杂度上界约为 O(k3lognp+kPlognp)


备注

注意中间可能要有64位整数相乘后取模的过程。
用黑科技就可以跑得飞快了。

附一下黑科技的代码

LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( db ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值