POJノミ

Z街は多くのノミに家です。Z土曜日は市内のライフスタイルチャンネルエンターテイメントを持っています。蚤は、中央の高いワイヤーに要求されます。ワイヤーは、それが無限に長いと見ることができ、非常に長いです。ショーのホストは、カードを送るのノミを与えるだろう。N + 1は、カードの自然数の上に書かれています。前者はMの数Nを超えないながら最後に、Mであり、カード上の同じ数を可能にします。各カード上のノミを任意の自然数S、および左または右ジャンプS部の長さから選択することができます。彼の最後のタスクは、彼がそこに位置し、贈り物をピックアップされ、単位長さを残したところからジャンプすることです。 
N = 2、M = 18、ノミのカードホルダー(10、15、18)は、タスクを完了することができる場合、例えば、彼は最初のジャンプが長い10個の単位を残し、次に左3回ジャンプし、各15単位長さ当たりの時間、および最後に右にも三回、長さの各18個の単位をジャンプ。フリーカード保有者(12、15、18)は、その後、どのように彼は単位長さを残したところからジャンプすることはできません。 
ときに決定さNとM、M ^ N明らかに異なったカードの合計。質問は今、あなたがタスクを完了することができますどのように多くのシーツ、これらのカードのすべてで、あります。 

入力

二つの整数N及びM(N <= 15、M <= 100000000)。

出力

カード番号は、タスクを完了します。

サンプル入力

2 4

サンプル出力

12

ヒント

12枚のカードがある: 
(1、1、4)、(1、2、4)、(1、3、4)、(1、4、4)、(2、1、4)、(2、 3、4)、 
(3、1、4)、(3、2、4)、(3、3、4)、(3、4、4)、(4、1、4)、(4、3、 4) 
私は少し前に長い時間を見て
問題方程式A1の解以上のものではありません* X1 + A2 * X2 +···+ *のXN + M * X(N + 1)= 1。
方程式の可解性の__gcd(A1、A3、A2、...、M)= 1を作製しました。
質問はそれを見つける方法であるので、だから私たちは、限り、それはそれで最大公約数1の組み合わせであるとしたいですか?
まず、Mを求める問題に変換するようにM ^ n個の選択肢の合計は、__GCD 1限り、我々は、最初に決定した後、1マイナス1であることはできず、数M、Nの位置を知っています組み合わせの数は、数字のGCDを求めていません1
私たちはそんなにデジタル共通因子が共通の因子Mでなければならない場合には、データの各セットは、Mを持つべきであることを知っているので、我々は最初のMのプライム分解でなければなりません

包含および除外は、最大公約数が1ではないので、それはM個々の要素の組み合わせでなければならない、すなわち、Mの素因数のすべてが配置されて、数の最大公約数が1でない、次に列挙最大公約数を仮定しますこれは他の中でも、N Mの数その後、nは

我々は、すべてのNの倍数でなければならないので、M / n個の合計は、(これは素因数であるため、私たちはLCMを追求せず、問題にそれを追加を指示することができます)を選択することができます。総KSM(M / N、N)を選択し(フラッシュパワー)の

その後も、合計GCDを減算し、最終ステップマイナスQijiaの包含および除外は、最終的な答えではない1であります

 

書式#include <iostreamの> 
の#include <cstdioを>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
CONSTの INT N = 1E6 + 7 
ARR [N] LL。

LLのKSM(LLのX、LLのY){ 
    LL RES = 1 一方、(Y){
         場合(Y&1)RES = RES * X。
        X = X * X; 
        Y >> = 1 
    } 
    戻りRESと、
} 

LL zfj(LLのM){ 
    LLのPOS = 0 にとって(LL I = 2 ; iは、* I <= M; iは++ ){
         場合(M%I == 0 ){ 
            ARR [POS ++] = I。
            一方、(M%のI == 0 ){ 
                M / = I。
            } 
        } 
    } 
    もし(M> 1 ){ 
        ARR [POS ++] =のM。
    } 
    戻りPOS。
} 
int型のmain(){ 
    LL N、M。
    CIN >> N >> M。
    LL POS = zfj(M)。
    LL S = 0 以下のためにint型私= 1 ; iが(< 1 << POS)を、iが++ ){ 
        LLのCNT = 0 
        LL和 = 1 INT J = 0 ; J <POS; J ++ ){
             場合1&(I >> J)){ 
                CNT ++ 
                合計 * = ARR [J]。
            } 
        } 
        もし(CNT&1 ){ 
            S + = KSM(M / 和、N)。
        } 
        { 
            S - = KSM(M / 和、N)。
        } 
    } 
    のprintf(" %LLDする\ n "、KSM(M、N) - S); 
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11360416.html