[NOIPアナログ試験7]問題の訪問溶液(数学的な組み合わせ+ CRT +ルーカス定理)

大麦

Tは、理由の制約のために、それは$暴力的なDPの$ O(T ^ 3)から抜け出すことは困難ではありません

しかし、私は30分を持っていると言われてみませんでしたか?

正の解決策は明らかに数学的な友人との組み合わせである場合

まず$ n個の、M $は負でもよいが、それは影響を与えませんでした、

正の混乱が右に行くためにすべてとして私たちは、それを扱うことができます

あなたは正しい方向に真に効果的なステップまたは他の2つは逆に上がるためにされていると考えることができます

Uは、歩行を設定数、D、Lの左、及び右R&LTであります

彼らは関係を満たします:

$ RL = M、UD = N、T = U + D + L + R $

$のM + N個の$のための手順の有効数ので、偶数$ $ TMNでなければなりません

残りのステップは、確実にするため、平均約上下平均、

$ 1つUDLR列挙$は、最終的な答えを得ることができます。

$ ANS = \和の\ limits_ {I = N、2 |(中)} ^ {TM} \ binom {T} {I} \ binom {I} {\ FRAC {} {2}} \ binom {TI} {\ FRAC {ティム} {2}} $

(皇帝の上に、そこからコピーします)

論理的にこの質問を言えば、終了する必要があります

しかし、熱狂的な人々のトピックはまだあなたについての病気:モジュラスが素数ではないかもしれません

しかし、それはexLucasのクラッチから私たちを救う、製品の品質の数が異なる数を指定する必要があります

ライン上の中国の剰余定理後

モジュラス$ pの素因数分解は、[i]は要素の各側に$は、$ ANSと呼ば答え、[i]は$であると考えられます

そして、当然の最終的な答えは、解決に相当します

$ \開始{ケース} X \当ans_1(MOD \ P_1)\\ X \当ans_2(MOD \ P_2)\\ X \当ans_3(MOD \ P_3)\\ ... \\ X \当ans_n(MOD \ P_N)\\ \端{ケース} $

これは、CRT、それを裸ではないでしょうか?取締役会は、逃げるために再びそれを打ちます。

EUの拡大は、あなたが合同式で設定フェルマーのほとんど理解のCRTと組み合わせた高速電力フロントを使用することができ、戦うために必要はありません。

// の#define R 
の#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの> 
する#include <ベクトル> 
の#include <cmath>
 の#define再登録
 用いて 名前空間STDを、
const  int型 N = 100005 ; 
typedefの長い 長いLL。
INT T、MOD、N、M。
LLのFAC [N]、ANS [ 1005 ]。
ベクトル < int型 > 事実。
int型のABS(INT X)
{ 
    戻り X < 0? -  ; X:X
}
ボイドディビ(INT X)
{ 
    int型 SQ = SQRT(X)+ 1 以下のためにint型 I = 2 ; iは= SQを<; iは++ 
    { 
        場合(Xの%I == 0 
        { 
            fact.push_back(I)。
            一方、(X%のI == 0)は、x / = I。
        } 
        もし(x == 1ブレーク
    } 
    もし(!X = 1 )fact.push_back(X)。
} 
LL qpow(LLのB、LLのP LL)
{ 
    LL RES = 1; =%のP。
    一方、(b)は、
    { 
        もし、(B&1)RES =のRES *%のP。= A *%のP; 
        B >> = 1 
    } 
    戻りRESと、
} 
LL C(LLのX、LLのY、LLのP)
{ 
    場合(X <Y)戻り 0 ;
    戻り FAC [X] * qpow(FAC [Y]、P 2、P)%のP *はqpow(FAC [XY]、P 2、P)%のP。
} 
LLルーカス(LL X、LLのY、LLのP)
{ 
    場合(!y)のリターン 1 リターン C(X%以下のP、Yの%のP、P)*ルーカス(X / P Y / P、P)%をP; 
} 
ボイドgetfac(LLのP)
{ 
    FAC [ 0 ] = 1 以下のためにint型 iは= 1 ; I <= T iが++ 
        FAC [i]は = 1LL * iは[I-FAC * 1 ]%のP。
} 
int型のmain()
{ 
    scanf関数(" %D%D%D%D "、&​​T、&MOD、&N、&M)。
    N = ABS面(N)、M = ABS面(M)。
    ディビ(MOD)。
    INT SZ = fact.size()。
    (RE INT今= 0今++;今<SZ 
    {
        INT P = 事実[今]; getfac(P)。
        ため(再int型 I = N; iは= Tmの<; iは++ 
        { 
            もし、((中)および1 ||(TIM)&1続けます
            LLのRES = 1 
            RESの =のRES *ルーカス(T、I、P)%のP *はルーカス(I、(中)/ 2、P)%のP *はルーカスチタン(Ti(TIM)/ 2、P)%のP。
            ANS [今] =(ANS [今] + RES)%のP。
        } 
    } 
    LL ANSS = 0 以下のための(再int型 I = 0; iはSZを<; iは++ 
    { 
        LL時間 = MOD / 事実を[I]。
        LL RESS = qpow(回、事実[I] - 2 、事実[I])。
        RESS =(RESS%の事実[I] +事実[I])%の事実[I]。
        ANSS =(ANSS +倍* RESS * ANS [I])%MOD。
    } 
    COUT <<(ANSS + MOD)%のMOD << ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Rorschach-XR/p/11230688.html
おすすめ