Bzoj2186:[Sdoi2008]沙拉公主的困惑:欧拉函数+乘法逆元

本文提供了一道名为[Sdoi2008]沙拉公主的困惑的算法题解,通过数学分析得出解题思路,并使用C++实现。文中详细解释了如何计算在一定区间内与m!互质的数的数量,以及如何预处理质因子逆元。

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

题目链接:2186:[Sdoi2008]沙拉公主的困惑

首先有

因为m<=n,所以n!一定是m!的倍数,在[1,m!]中于m!互质的数个数为phi[m!],在[m!+1,n!]中根据可知有(n!-m!)/m!个

所以答案为

因为,其中pi是m!的质因子,所以答案是,pi是m!的质因子

其中m!的质因子就是m的质因子

还要预处理出pi的逆元,可以递推,公式ine[i]=(mod-mod/i*ine[mod%i]%mod);

离线处理即可,神犇说卡常数然而我并没有卡QwQ

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10000010;
int T,mod,p[1000010],ine[maxn];
struct ques{int n,m;}q[10010];
int jc[maxn],mxn,mxm,ret[maxn],N=0;
bool vis[maxn];

int main(){
	scanf("%d%d",&T,&mod); jc[1]=ine[1]=ret[1]=1;
	for (int i=1;i<=T;++i)
	    scanf("%d%d",&q[i].n,&q[i].m),
		mxn=max(mxn,q[i].n),mxm=max(mxm,q[i].m);
	for (int i=2;i<=mxn;++i) jc[i]=1LL*jc[i-1]*i%mod;
	for (int i=2;i<=mxm;++i){
		if (!vis[i]) p[++N]=i;
		for (int j=1;p[j]*i<=mxm&&j<=N;++j){
			vis[p[j]*i]=1;
			if (i%p[j]==0) break;
		}
	}
	for (int i=2;i<=mxm&&i<mod;++i)
	    ine[i]=(mod-1LL*mod/i*ine[mod%i]%mod);
	for (int i=2;i<=mxm;++i){
		ret[i]=ret[i-1];
		if (!vis[i]) ret[i]=1LL*ret[i]*(i-1)%mod*ine[i%mod]%mod;
	}
	for (int i=1;i<=T;++i)
		printf("%d\n",1LL*jc[q[i].n]*ret[q[i].m]%mod);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值