关于整除分块时的模数
  • 板块P5221 Product
  • 楼主FxorG
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/1/27 17:09
  • 上次更新2023/11/5 04:18:03
查看原帖
关于整除分块时的模数
125901
FxorG楼主2021/1/27 17:09

我在整除分块的时候mod (mod-1)就过 % mod就30分 请问大佬们这是为什么

ll solve(ll n) {
	ll ret=0;
	for(int l=1,r;l<=n;l=r+1) {
		r=min(n,n/(n/l));
		ret+=(mu[r]-mu[l-1])*((n/l)%mod)*((n/l)%mod);
		ret=((ret%mod+mod)%mod);
	}
	return ret%mod;
}

signed main() {
	n=rd();
	init(n);
	ll sum=1;
	for(int i=1;i<=n;i++) sum=(sum*(ll)i)%mod;
	ll f=fpow(sum,(n<<1));
	ll tmp=1;
	for(ll i=1;i<=n;i++) {
		int ret=solve(n/i);
		tmp=(tmp*fpow(i*i,ret))%mod;
	}
	tmp=fpow(tmp,mod-2);
	printf("%lld",(f*tmp)%mod);
	return 0;
}
ll solve(ll n) {
	ll ret=0;
	for(int l=1,r;l<=n;l=r+1) {
		r=min(n,n/(n/l));
		ret+=(mu[r]-mu[l-1])*(n/l)%(mod-1)*(n/l)%(mod-1);
		ret=((ret%(mod-1)+mod-1)%(mod-1));
	}
	return ret%(mod-1);
}

signed main() {
	n=rd();
	init(n);
	ll sum=1;
	for(int i=1;i<=n;i++) sum=(sum*(ll)i)%mod;
	ll f=fpow(sum,(n<<1));
	ll tmp=1;
	for(ll i=1;i<=n;i++) {
		int ret=solve(n/i);
		tmp=(tmp*fpow(i*i,ret))%mod;
	}
	tmp=fpow(tmp,mod-2);
	printf("%lld",(f*tmp)%mod);
	return 0;
}
2021/1/27 17:09
加载中...