思路
分四种情况讨论,注意p保证是一个素数,这个条件非常关键。
- n>=2p,如果r!=0显然无解,因为p,2p已经有两个p因子了,所以模p余数只能为0,r==0则我们随便输出一个合法的即可
- n>p&&n<2p,r==0则随意变换一个除p外的数,不然暴力枚举。
- n==p,r==0则若n==2无解,否则随意输出一个合法解。如果r!=0那么因为p是素数,我们由威尔逊定理(p-1)!同余于p=1得到最后的判定条件为(p-1)i%p==r然后进行暴力枚举
- n<p,我们有1*2*…*n同余r(模p意义下),我们枚举i,对两边乘上1*2*…*n的逆元然后去掉i就是i位置该放的值,判定是否合法即可。
代码
1 |
|