HDU - 6641 TDL(数学)

問題の説明
正の整数のための N、の関数を表すものとF N MをとしてM番目の最小の整数X 、X > NおよびGCD X N = 1例えば、F 5が1 = 6、およびF 5 5 = 11

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

 

入力
入力の最初の行は整数含ま T 1 T 10 テストケースの数を表します。

各テストケースでは、二つの整数が存在するkはM 1 K 10 18 1 M 100
 

 

出力
各テストケースのために、最小表す整数を含む単一の行を印刷 Nを解決策、出力``存在しない場合は-1「」の代わりに。
 

 

サンプル入力
2 3 5 6 100
 

 

サンプル出力
5 -1
 

 

ソース

ソリューション:

(F(N、M)-n)\ bigoplus N = K

D = F(N、M)-N

D = N \ K bigoplus

N = D \ bigoplus K

/// 
///                             _ooOoo_
 ///                            o8888888o
 ///                            88" 88。」
 ///                            (| -_- |)
 ///                            O \ = / O
 ///                         ____ / `--- '\ ____
 / // \\ | | // `。
///                      / \\ ||| :||| // \
 ///                     / _ ||||| - : - ||||| - \
 ///                     | | \\\ -   /// | |
///                     | \ _ | '' \ --- / '' | |
///                    \ .- \ __ `-` ___ / - 。/
 ///                   ___ `。。」/--.-- \ `。__
 ///                。 "" ' < `.___ \ _ <|> _ / ___。' > ' ""。
///               | | 。: ` - \`; `\ _ /`;.`/ - `:| |
///               \ \ ` - 。\ _ __ \ / __ _ /。、 `/ /
 ///          ======` `-.____ -.___ \ _____ / ___.-` ____.- "======
 ///                             `= --- =」
 ///         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
 ///                       仏祝福、ノーバグ!
///
する#include <iostreamの> 
の#include <cstdioを> 
する#include <
書式#include <CStringの> 
の#include <cmath> 
の#include <cstdlib> 
書式#include <キュー> 
の#include <スタック> 
の#include <ベクトル>
 使用して 名前空間はstd;
#define MAXN 100010
 の#defineっ長い長いint型のT、M。
LL kを、ans_n。
LL CAL(LL N、int型M)
{ 場合(N < 1 戻り0 ;
    (LL I = N + 1 ; iは++ 場合(__gcd(N、I)== 1 



      
        {
            M - もし(M == 0 リターン I - N。/// (I - N)=(F(N、M) - n)は= D 
        } 
} 

int型のmain()
{ 
    scanf関数(" %のD "、&T)。
    一方、(t-- 
    { 
        scanf関数(" %のLLD%dの"、&​​K&M)。
        ans_n = - 1 int型、D = 1 ; D <= 1000年 ; D ++  
        { 
            IF(CAL(K ^ D、M)== D)
            { 
                IF(ans_n == - 1 
                    ans_n = K ^ D;
                  IF(ans_n>(K ^ D))/// ^動作が優先されより小さい<>   == =! 
                    ans_n = K ^ D; 
            } 
        } 
        のprintf(" %LLDの\のN- " 、ans_n); 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/RootVount/p/11358647.html