問題P5265 [テンプレート]多項式逆三角関数へのソリューション

→_→OI後半のキャリアは、私たちが搭乗質問を磨くようになりました

実際には、この問題は多項式の家族のバケットベジボード2に従事する学生があまりに式コードの下にすることができ輝く、タイトル・トラックのための公式です...

まあ証拠式...短いペースト式のように:

\ [逆正弦(F)= \のINT {F '\ \のSQRT上{1-F ^ 2}} \]

\ [アークタンジェント(F)= \ INT {F '\ 1オーバー+ F ^ 2} \]

カンは、その後、使用のSqrt、Invの、インテル、Direvのが出てここにあります 一般 多項式タイトル

コード

//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=3e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int dec(int x,int y){return (x-=y)<0?x+mod:x;}
inline int inc(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int read(){ int x=0,f=1; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr=' '){
    if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,tp,d,limit; arr a,b,r[21],lg,inv,G[2];
inline int qpow(Rg int x,Rg int p=mod-2,Rg int s=1){
    for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
namespace Poly{
    inline void init(Rg int n){ d=0;
        for(limit=1;limit<=n<<1;limit<<=1)++d;
    }
    inline void prep(int n){ inv[1]=1,init(n);
        fp(i,2,limit) inv[i]=mul(mod-mod/i,inv[mod%i]);
        fp(d,1,19){ lg[1<<d]=d; fp(i,0,(1<<d)-1)
            r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));
        }
        for(Rg int t=(mod-1)>>1,i=1,x,y;i<262144;i<<=1,t>>=1){
            x=qpow(3,t),y=qpow(iG,t),G[0][i]=G[1][i]=1;
            fp(k,1,i-1) G[1][i+k]=mul(G[1][i+k-1],x),G[0][i+k]=mul(G[0][i+k-1],y);
        }
    }
    inline void NTT(int* a,int tp){ fp(i,0,limit-1) if(i<r[d][i]) swap(a[i],a[r[d][i]]);
        for(Rg int mid=1,I=2;mid<limit;mid<<=1,I<<=1) for(Rg int j=0,y;j<limit;j+=I) fp(k,0,mid-1)
            y=mul(G[tp][mid+k],a[j+k+mid]),a[j+k+mid]=dec(a[j+k],y),a[j+k]=inc(a[j+k],y);
        if(tp) return ; fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
    }
    void Inv(int* a,int* b,int n){
        static arr C,D; if(n==1) return b[0]=qpow(a[0]),void();
        Inv(a,b,(n+1)>>1),init(n); fp(i,0,n-1) C[i]=a[i],D[i]=b[i];
        fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
        fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i])); NTT(C,0);
        fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]); fp(i,n,limit-1) b[i]=0;
    }
    void Sqrt(int* a,int* b,int n){
        static arr D,F; if(n==1) return b[0]=sqrt(a[0]),void();
        Sqrt(a,b,(n+1)>>1); fp(i,0,n<<1) F[i]=0;
        Inv(b,F,n),init(n); fp(i,0,n-1) D[i]=a[i];
        fp(i,n,limit-1) D[i]=0; NTT(D,1),NTT(b,1),NTT(F,1);
        fp(i,0,limit-1) b[i]=mul(inc(b[i],mul(D[i],F[i])),inv[2]);
        NTT(b,0); fp(i,n,limit-1) b[i]=0;
        memset(D,0,limit<<2),memset(F,0,limit<<2);
    }
    inline void Direv(int* a,int* b,int n){
        fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=b[n]=0;
    }
    inline void Inter(int* a,int* b,int n){
        fp(i,1,n-1) b[i]=mul(a[i-1],inv[i]); b[0]=0;
    }
    inline void Arcsin(int* a,int* b,int n){
        static arr A,B,C; Direv(a,A,n),init(n),NTT(a,1);
        fp(i,0,limit-1) B[i]=dec(1,mul(a[i],a[i])); NTT(B,0);
        fp(i,n,limit-1) B[i]=0; Sqrt(B,C,n),Inv(C,B,n),NTT(A,1),NTT(B,1);
        fp(i,0,limit-1) A[i]=mul(A[i],B[i]); NTT(A,0); Inter(A,b,n);
    }
    inline void Arctan(int* a,int* b,int n){
        static arr A,B,C; Direv(a,A,n),init(n),NTT(a,1);
        fp(i,0,limit-1) B[i]=inc(mul(a[i],a[i]),1);
        NTT(B,0),Inv(B,C,n),NTT(A,1),NTT(C,1);
        fp(i,0,limit-1) A[i]=mul(A[i],C[i]);
        NTT(A,0); Inter(A,b,n);
    }
} using namespace Poly;
int main(){
    n=read(),tp=read(),prep(n);
    fp(i,0,n-1) a[i]=read();
    if(tp) Arctan(a,b,n);
    else Arcsin(a,b,n);
    fp(i,0,n-1) print(b[i]);
    return Ot(),0;
}

基礎となる最適化の瞬間には、前の最初のページに行ってきました...

そして、私たちは(私たちはカンを理解しようと感じることはありませんが)カンが問題にアップデートソリューションの後に、それを証明できる方法を理解します

UPD

魚の導出過程の健康... ORZ神の魚を理解するために、神の助けを借りてNacly_Fish

まず、我々はすべての機能のために存在することを知っています:

\ [F(X)= \ INT F '(X)\]

用語のどの残りの部分よりも不確かではない与え、国境を気にしないでください...

まあ、これはYaziの正しい式でなければなりません。

\ [F(X)= \ INT F '(x)+ R(X)\]

前記\(R(X)\)であります残りは、あなたがそれは統合後の最後の項目にそれを作ることを余儀なくされていると思うかもしれ(派生後なぜなら情報の定数項損失の、情報を統合した後、0を従事なりました)

三角関数と逆三角関数(LV、アイテムの無制限の数)の優れた特性、木材上のR outに

その後、我々は、元の問題を考慮してください。

最初のアークサインのために、私たちはその誘導体を見つけることができ、その後、解決し、統合、それはこのようなものはどのように評価するかを派生?

まあ何のナンセンス直接証拠は、食事良いことを終了していません。

\ [\開始{整列} \開始{ケース}罪 '(X)= {DX上のDy \}は\\罪'(X)= COS(X)\端{ケース} DX上\\ \ RIGHTARROW {DYの\ } = DY上のcos(x)は\\ {DX \ DY上} = {COS上1 \(X)} \\ {〜dはアークサイン(Y)\} = {1 \ \のSQRT {1-y ^ 2上}} \端{整列} \]

すなわち、xの既知の値、の存在です。

\ [\ {整列}アークサインを始める(X)= {\のSQRT上1 \ {1-x ^ 2}} \\アークサイン(x)= \のINT {\のSQRT上1 \ {1-x ^ 2}} \端{整列} \]

そう\(逆正弦(X)\)で表される\(X \)変数として\(アークサイン(F(x)は )\) 次に多項式のためのものです。

\ [\開始{整列}逆正弦(X)&=アークサイン(F(x))を\\逆正弦 '(X)&=アークサイン(F(x))を' \\逆正弦 '(X)&=アークサイン'(F (x))をF '(x)の逆正弦\\'(X)&= {F '(X)\オーバー\ SQRT {1-F ^ 2(X)}} \\逆正弦(X)&= \ INT { F '(X)\オーバー\ SQRT {1-F ^ 2(X)}} \端{整列} \]

QED

次いでケンケン\(逆正接\) あなたがあれば同様の方法として、一口を所有することができる(日焼け「(X)= \ {COS ^ 2を超える1 \(x)は} \) のように設定します

あなたは、あなた自身のプッシュを開始することができます...

その後、我々は取り壊します:

\ [\開始{整列} \開始{ケース}褐色 '(X)= {DY \上DX} \\褐色'(X)= \端{ケース} {COS ^ 2(X)上に1 \} \\ {DY上DX \} {DY上DX \} \ RIGHTARROW {DX上のDy \} = {1 \ COS ^ 2上(X)} \\ = COS ^ 2(X)\\ = {COS ^ 2(X )\罪^ 2(X)+ COS ^ 2(X)} \\ {DX \ DY上} = {1 \ + 1上日焼け^ 2(X)} \\ {D〜アークタンジェント(Y)上\上DY} = {1 \ + 1上のY ^ 2} \端{整列} \]

その後:

\ [\ {整列}アークタンジェント '(x)= {1 \ + 1上のx ^ 2} \\逆正接(X)= \のINT {1 \ + 1上のx ^ 2} \端{整列を} \始めます]

接着:

\ [\開始{整列}アークタンジェント(X)&=逆正接関数(F(x))を\\逆正接 '(X)&=逆正接関数(F(x))を' \\逆正接 '(X)&=逆正接'(F (x))をF '(x)の逆正接\\'(X)&= {F '(X)\ + 1を超えるF ^ 2(X)} \\逆正接(X)&= \ INT {F'(X )\ + 1を超えるF ^ 2(X)} \端{整列} \]

おすすめ

転載: www.cnblogs.com/Judge/p/11615446.html