TDL HDU - 6641(数学+列挙)

質問は、表面:

正の整数を  N、N、の関数を表すものと  FがN M としてF(n、m)は  m個の m番目の最小の整数  X、Xその  X > N X> nおよび  GCD X N = 1(GCD X、N)= 1。例えば、のための  F 5 1 = 6、F(5,1)= 6、  F 5 5 = 11、F(5,5)= 11。 

あなたは、の値が与えられている  のmメートルとを  F N M - N N(F(N、M)-N ``)⊕n、 ⊕ ''ビット単位のXOR演算を表します。最小の正の整数を見つけるために、プログラムを作成してください  nは nは  F N M - N N = K(F(N、M)-N)⊕n= K、またはそれが不可能であるかを決定。

質問の意味:

F N、M )の比を表し、N が大きいほど、m個目とnは互いに素番号。与えられたN- K = K(F(N、M)-n)N- ^ Qのnが最小です。メートルまでの100

アイデア:

ことが意図されている F(n、m)は及びません以上のn が大きすぎるので、我々は列挙することができる(n、m)はF -nを

それぞれについて私は、によって、N = K ^ iが、現在の取得Nを、その後決定N + Iを正確ならば、N M ここでのn +かどうかを判断し、N m iをしていない(素数番目互いに素とき回答数)。

ハイライト:

私たちの列挙の上限については。GCD(N + K、N)GCD(N、K)はGCD(K、N%Kを)== 、以降1〜kは、少なくとも有するK / LGK 素数、N N + kは少なくとも内/ K LGK 番目とnは互いに素番号。

したがって、上部は結合 = 700(アップ/ lgup>アップ 100

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineは長い長いっ
LL K、M、N、キー、I。
ブール  チェック()
{ 
    LL S = 0、J = 1 (;; J ++ 
    { 
        場合(__gcd(N、N + J)== 1)S ++ もし(S == mの)ブレーク
    } 
    戻り J == I; 
} 
int型のmain()
{ 
    int型のT。
    CIN >> T;
    しばらく(T--  
    {
        CIN >> K >> M。
        LL ANS = - 1 (i = 1 ; iは< 700 ; iは++ 
        { 
            N = K ^ I。
            もし(N> = 2 && チェック())
            { 
                場合(ANS == - 1)ANS = N。
                 ANS = 分(N、ANS)。
            } 
        } 
        COUT << ANS << ENDL。

    } 
    戻り 0 
}

 

 

おすすめ

転載: www.cnblogs.com/yzxqq/p/11329620.html