問題P3811 [テンプレート]逆数を解決

表題シークすることを意図している(私は\)\を金型内に\(P \)逆元の意味で\(\ FRAC {1} { I} \) すなわち\(INV(I)\) 明らかに請求項で指定された対象データの範囲は、線形アルゴリズムを反転します。

オーダー\(P = AI + B \)は、存在する:
[AI + B \当量0(\ MOD P)\] \
:転置得
\ [AI \当量の-B(\ MOD P)\]
係数単純化を得られた:
\ [I \当- \ FRAC {B}、{A}(\ MOD P)\]
得られた逆を取る:
\ [\ FRAC {1} {I} \当- \ FRAC {A} {B}(\ MOD P)\]
すなわち
\ [INV(I)\当
- \ FRAC {A}、{B}(\ MOD P)\] 得られた負変形を避けるために:
\ [INV(I)\当量\ FRAC {PA} {B}(\ MOD P)
\] 特徴:
\ [A = P / I、Pの%のB = I \]

\(コード:\)

#include<bits/stdc++.h>//P3811 【模板】乘法逆元
using namespace std;
#define re register
#define ll long long
#define il inline
#define dou double
#define un unsigned
il int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
#define INF 114514114
#define clr(x) memset(x,0,sizeof(x))
#define N 3000000+10
int n,p;
int inv[N];
int main()
{
    n=read();p=read();
    inv[1]=1;
    for(re ll i=2;i<=n;i++)inv[i]=(ll)(p-p/i)*inv[p%i]%p;
    for(re ll i=1;i<=n;i++)printf("%d\n",inv[i]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Hakurei-Reimu/p/11485640.html