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

本文介绍了一种高效计算特定形式调和级数的算法,该算法适用于求解形如∑ni=11i(modpk)的问题。通过对问题进行分解,将计算过程分为两大部分,并通过矩阵乘法等手段降低计算复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值