正题
评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3811
题目大意
求1∼n1\sim n1∼n中modpmod\ \ pmod p的逆元。
解题思路
首先对于p,我们将其分解为ki+r(k=⌊pi⌋,r=p%r)ki+r(k=\lfloor \frac{p}{i}\rfloor,r=p\%r)ki+r(k=⌊ip⌋,r=p%r),然后有
ki+r≡0(modp)ki+r\equiv 0(mod\ \ p)ki+r≡0(mod p)
左右两边同时乘上一个i−1∗r−1i^{-1}*r^{-1}i−1∗r−1
k∗r−1+i−1≡0(modp)k*r^{-1}+i^{-1}\equiv 0(mod\ \ p)k∗r−1+i−1≡0(mod p)
i−1≡−k∗r−1(modp)i^{-1}\equiv -k*r^{-1}(mod\ \ p)i−1≡−k∗r−1(mod p)
i−1≡−⌊pi⌋∗(p%i)−1(modp)i^{-1}\equiv -\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}(mod\ \ p)i−1≡−⌊ip⌋∗(p%i)−1(mod p)
反正本来就要%p\%p%p
i−1=−⌊pi⌋∗(p%i)−1%pi^{-1}= -\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}\%pi−1=−⌊ip⌋∗(p%i)−1%p
因为iii比(p%i)(p\%i)(p%i)小,按照递推的顺序我们在求出i−1i^{-1}i−1之前就已经求出(p%i)−1(p\%i)^{-1}(p%i)−1了。但是我们还要保证不是负数,所以我们可以直接计算
i−1=p−⌊pi⌋∗(p%i)−1%pi^{-1}= p-\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}\%pi−1=p−⌊ip⌋∗(p%i)−1%p
code
#include<cstdio>
using namespace std;
int n,p;
long long inv[3000010];
int main()
{scanf("%d%d",&n,&p);inv[1]=1;printf("%d\n",inv[1]);for(int i=2;i<=n;i++)inv[i]=(long long)p-p/i*inv[p%i]%p,printf("%d\n",inv[i]);
}