でも3つの学校のモットーXOR問題の解決

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]。
}

 

おすすめ

転載: www.cnblogs.com/kamimxr/p/11607728.html