线性求逆元(模板题)

直接上AC代码

#include
using namespace std;
#define ll long long
const int twx=3e6+100;
const int inf=0x3f3f3f3f;
ll read()
{
    ll sum=0;
    ll flag=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
        {
            flag=-1;
        }
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        sum=((sum*10)+c-'0');
        c=getchar();
    }
    return sum*flag;
}
ll a[twx];
ll n,p;
void init()
{
	n=read();
    p=read();
}
void work()
{
	a[1]=1;
	for(int i=2;i<=n;i++)
    {
        a[i]=(-(p/i)*a[p%i])%p;
    }
}
void print()
{
	for(int i=1;i<=n;i++)
    {
        printf("%lld\n",(a[i]+p)%p);
    }
}
int main()
{
	//freopen("invele.in","r",stdin);
	//freopen("invele.out","w",stdout);
    init();
    work();
    print();
	return 0;
}

当然还有更简单的

废话不多说直接上

#include
using namespace std;
long long n,p,inv[3000006];
int main()
{
	cin>>n>>p;
	inv[1]=1;
	printf("1\n");
	for(long long i=2; i<=n; i++)
	{
		inv[i]=(p-p/i)*inv[p%i]%p;
		printf("%lld\n",inv[i]);
	}
	return 0;
}

你可能感兴趣的:(算法,数据结构)