XOR
(xor.cpp / .C)
タイトル説明
において、正の整数nを考えると[1、n]の範囲、乱数の数(B)を満たすGCD(A、Bで得られ)XOR Bは=。[入力形式の入力コモン線、正の整数n。[]出力形式の出力コモン線、正の整数の答え。サンプル[O] [入力]サンプル3 [出力]サンプル1 [説明]サンプルのみ(2、3)の要件を満たします。[データ]の範囲のデータの30%、n≤1000。データの60%、n≤10^ 5の場合。データの100%、n≤10^ 7へ。
タイトル効果:見つけ、Nが与えられる[1、n]はGCDの数(B)== A ^ Bにおいて、(順不同)。
> B、我々が知っていることを前提としているGCD(a、b)は= GCD(AB、B)、2つの正の整数の最大公約数は二つの数字なので、GCD(a、b)は≤abを超えてはならないしながら、
xのi番目のビット、i番目のビットB yにしましょう。
場合X = 1又はX = Y = 0は、= XのXOR YがX-Yで
X = 0、Y = 1、あるXのXOR Y = 1、XY = -1、すなわちX XOR Y> XY。
そこで、我々は、XORb≥abを歩んでいます。
したがって、GCD(A、B)= A ^ B = AB。
Cを設定= AB、そこGCD(AC)は、C、すなわち、我々は、複数を満たすために必要と≠C C =
複雑:[1、N]で、iの倍数[N / i]はA、それほど複雑である。nlogn。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INT [F 10000001 ]。 INT のmain() { int型のn; cinを >> N; 以下のために(int型 i = 1 ; iが<= 5000000 ; I ++ ){ ため(int型 J =私は* 2、J < 10000000 ; J + = I){ int型、B = J- I。 もし ++ [J] F((J ^ B)== i)は、 } } のための(INT I = 1; iが<= N; iは++)F [I] + = F [I- 1 ]。 COUT << F [N]。 }