社区讨论

你的exlucas板子可能是假的!

P4720【模板】扩展卢卡斯定理 / exLucas参与者 24已保存回复 23

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
22 条
当前快照
1 份
快照标识符
@mkhwaxea
此快照首次捕获于
2026/01/17 13:57
上个月
此快照最后确认于
2026/01/19 22:20
上个月
查看原帖
在计算 n!px\frac{n!}{p^x}pkp^k 的余数时(代码中令 r=pkr=p^k),正确的计算方式如下:
CPP
	int ca(int n){
		if(n==0) return 1;
		return ca(n/p)*qp(s[r-1],n/r,r)%r*s[n%r]%r;
	}
	int sec(int n,int m,int x,int y){
		p=x,k=y,r=qp(x,y,inf);
		int c=re(n)-re(m)-re(n-m);
		s[0]=1;
		for(int i=1;i<r;i++){
			s[i]=s[i-1];
			if(i%p) s[i]=s[i]*i%r;
		}
		int ans=qp(p,c,r);
		int d1=ca(n);
		int d2=ca(n-m);
		int d3=ca(m);
		return ans*d1%r*inv(d2,r)%r*inv(d3,r)%r;
	}
可以画图自行理解。
但是,如果你不小心把 ca 函数写成了下面这个东西,你可能仍能 AC 此题,但是这是错误的!
CPP
	int ca(int n){
		if(n==0) return 1;
		return ca(n/p)*qp(s[p-1],n/p,r)%r*s[n%p]%r;
	}
这里给一份 hack:输入 3 1 4,应该输出 3
如果代码错误的输出 1,原因是:
你的代码可能将 pp 当成了一个周期,在计算 3!3! 时,理论上应该计算 1×2×31\times 2\times 3 除掉 22 因子后模 44 的值。但是代码错误的将 p=2p=2 当作周期并错误的认为的 331144 的值相同,导致得出 11 的结果。

回复

23 条回复,欢迎继续交流。

正在加载回复...