我在整除分块的时候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;
}