[Noip2014] P2312解く方程式

P2312の解決の方程式

実際には、この質問は1元N式の区間[1、M]の整数解を求めています。

我々は、結果がゼロではない見ることができるの多項式に、[1、M]のすべての整数を列挙する。

あるスキルがあるホーナー法は、読者が自分自身を見て学んでいます。

時間Oの複雑さ(N * M)。

そして、あなたは30ポイントを得ることができる必要があります。

私たちは、これらの数字は、オープン精度に大きすぎることがわかりました。そして、あなたは喜んで50分を要した - Oの複雑さ(N * M *長さ)が爆発します。

ここでは、ハッシュのアイデアを検討し、その結果の剰余(好ましくは、大きな素数P)が、結果はこれが解決することをゼロ手段である場合。

これはどちらかのソリューションであるか、結果がpの倍数であるので、結果は、ゼロであるべき場合(これの確率は、検討する必要がないように、非常に小さな、小さな十分です)。

あなたの運が本当に悪い場合には、いくつかの異なる素数を試してみてください。これがない作業を行う場合は、宝くじを買うことができるの#include <iostrea A使って 名前空間はstdを、

CONST  長い  P = 1E9 + 7 

長い  N、M、[ 110 ]年[ 1000010 ] CNT。

長い 長いリード(){
     // モジュロに読み取る
        長い 長い RET = 0、F = 1。;
     CHAR CH = GETCHAR();
     ながら(!isdigit(CH)){
         IF(CH == ' - ')F = - 1。 
        CH = GETCHAR()。
    }
    一方、(isdigit(CH)){ =(右* 10 + CH - ' 0 ')%のP。
        CH = GETCHAR()。
    }
    戻り右* F;
}



INT メイン(){
    CIN >> N >> M。
    以下のために長い 長い私は= 0 ; iが<= N; iが++ ){
        A [I] = リード(); //これは直接読み取ることができません(これは、高速読み取りではありません)
    }
    以下のために長い 長い私= 1 ; iが<= M; I ++ ){
         長い  X = I、FX = 0 // 秦九韶算法
        ための長い 長い J = N; J> = 0 ; j-- ){
            FX =(([J] + FX)* X)%のP。
        }
        もし(FX == 0 ){
            年[ ++ CNT] = X;
        }
    }
    coutの << CNT << てendl;
    以下のための長い  iは= 1 ; iが<= CNT; I ++ ){
        COUT << ANS [I] << ENDL。
    }
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/zcr-blog/p/11826651.html