BM線形回帰テンプレート

#include <ビット/ STDC ++ H>
 の#define融点make_pair用
 の#define(iは= int型、iがN <; I ++の)のための担当者(I、N)
 の#define(I、N)当たりのための(INT iが= N-1、I> =; i--)
 の#define PB一back
 の#define融点make_pair
 の#define全て(X)(X).begin()、(X).END()
 の#define Fiの最初
 の#define SE第二
 の#define SZ(X)((INT)(X).size())
 使用して 名前空間STD。
ベクトルのtypedef < 整数 > VI。
typedefの長い 長いLL。
typedefのペア < int型int型 >PII;
constの LL MOD = 1000000007 ; 
{LL RES(LLのB LL)のLL powmod = 1%= MOD。アサート(B> = 0)。(; B; B >> = 1){ 場合(B&1のRES =のRES)*%のMOD。= A *%モッズ; } 戻りRESと、}
 // ヘッド
LL N。
名前空間linear_seq {
     CONSTの 整数 N = 10010 
    LL RES [N]、塩基[N]、_C [N]、_md [N]。

    ベクトル < int型 > メリーランド州;
     MUL(LL用* Aを、LLの* bの、int型K){ 
        担当者(I、0、K + K)_c [I] = 0 ; 
        担当者(I、0、k)の場合([i])と担当者(j、0、k)は_C [iがjは+] =(_C [iがJ +] + [I] * B [j])%MOD ;
        int型 - I = K + K 1 ; I> = K i--)場合(_c [i])と
            担当者(j、0、SZ(MD))_c [I - K + MD [J] = (_c [I - K + MD [J]] - _C [I] * _md [MD [J])%MOD。
        担当者(I、0、k)は[I] = _C [I]。
    } 
    INT解く(LL N、VI、VIのB){ //[0] * [n]は、B +···=初值B [N + 1]系数B
                                   //         のprintf( "%d個の\ n"、SZ(b)参照)。
        LL ANS = 0、PNT = 0 int型 K = SZ(A)。
        アサート(SZ(A) == SZ(b)参照)。
        担当者(I、0、k)は_md [K - 1 - I] = -a [I]。_md [k]は= 1 
        Md.clear(); 
        担当者(I、0、K)であれば(_md [I] =!0 )Md.push_back(I)。
        担当者(I、0、k)はRES [I] = 基地 [I] = 0 ; 
        解像度[0 ] = 1 ;
        一方、((1LL << PNT)<= n)のPNT ++ INT P = PNT; P> = 0 ; P-- ){ 
            MUL(RES、RES、K)。
            場合は((N >> P)&1 ){
                 ためint型 I = K - 1 ; I> = 0 ; i--)RES [I + 1 ] =のRES [i]は、RES [ 0 ] = 0 ; 
                担当者(j、0、SZ(MD))RES [MD [J] =(RES [MD [J]] - RES [K] * _md [MD [J])%MOD。
            } 
        } 
        担当者(I、0、K)ANS =(ANS + RES [I] * B [i])と%MOD。
        もし(ANS < 0)ANS + = MOD。
        戻るANSを。
    } 
    VI BM(VI S){ 
        VI C(11)、B(11 )。
        INTは L = 0、M = 1、B = 1 
        担当者(nは、0 、SZ(S)){ 
            LLさd = 0 
            担当者(I、0、L + 1)D =(D +の(LL)C [I] * S [N - I])%MOD。
            もし(D == 0)++ M。
            他の 場合2 *のL <= N){ 
                VI T = C。
                LLのC = MOD - D * powmod(B、MOD - 2)%MOD。
                一方、(SZ(C)<SZ(B)+ M)C.pb(0 )。
                担当者(I、0、SZ(B))C [iがMを+] =(C [iがmを+] +のC *のB [i])と%MOD。
                L = N + 1 - L。B = T。B = D。M = 1 
            } 
            { 
                LLのC = MOD - D * powmod(B、MOD -2)%のMOD。
                一方、(SZ(C)<SZ(B)+ M)C.pb(0 )。
                担当者(I、0、SZ(B))C [iがMを+] =(C [iがmを+] +のC *のB [i])と%MOD。
                ++ M。
            } 
        } 
        戻りCと、
    } 
    int型ガオ(VI、LL N){ 
        VI C = BM(A)を、
        c.erase(c.begin())。
        担当者(I、0、SZ(C))C [I] =(MOD - C [i])と%MOD。
        リターンは解決する(N、C、VI(a.begin()、a.begin()+ SZ(c)参照))。
    } 
}。

 {main()のint型
    のcin >> nは、
    ベクトル < int型 > V。
    INT [] = { 392040851914269312028444497652143046970 }。
    以下のためにint型 i = 0 ; iは<= 12 ; iは++ )V.push_back([I])。
    printf(" %LLDの\ nを"、1LL * linear_seq ::ガオ(V、N - 1)%のMOD)。
}

 

おすすめ

転載: www.cnblogs.com/philo-zhou/p/11416267.html