質問は、表面:
正の整数を 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 。 }
)。