奇偶數(二分)

2021-10-02 11:48:15 字數 1861 閱讀 5530

題目描述

小w定義了乙個奇偶的交換規則,當乙個數x是偶數的時候,就變成x/2,當x是奇數的時候,就變成x-1,直到x變成1。

利用這個規則,我們可以寫下path(x)表示從x開始按照上述規則不斷變換的乙個序列。例如,path(1)=[1],path(15)=[15,14,7,6,3,2,1],path(32)=[32,16,8,4,2,1]。

現在我們要求的是乙個最大的y,使得y至少在k個path(x)裡面出現,其中1≤x≤n。

例如,當n=11,k=3時候,答案是5,因為5在path(5),path(10),path(11)裡面都出現了,具體我們看這幾個:path(5)=[5,4,2,1],path(10)=[10,5,4,2,1],path(11)=[11,10,5,4,2,1],已經沒有更大的數出現的次數至少是3次。

又比如,當n=11,k=6時候,答案是4,因為4在path(4),path(5),path(8),path(9),path(10),path(11)裡面都出現了,已經沒有更大的數出現的次數至少是6次。

輸入

輸入一行,僅有兩個正整數n和k。

輸出

輸出最大的能滿足條件的整數y。

樣例輸入

【樣例1】

11 3

【樣例2】

11 6

【樣例3】

20 20

【樣例4】

1000000 100

樣例輸出

【樣例1】

5【樣例2】

4【樣例3】

1【樣例4】

31248

提示

對於100%的資料,1≤k≤n≤109

思路

通過模擬可推出每個數字答案的構造規律,當整數x為偶數是路徑中有x的數為x,x+1,2x,2x+1,2x+2,2x+3…,當整數x為奇數是路徑中有x的數為x,2x,2x+1,2x+2,2x+3…,因此對於奇數和偶數,其分別具有連續性,即可求解

**實現

#pragma gcc optimize(3,"ofast","inline")

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int n=55;

const

int m=

4005

;const

int inf=

0x3f3f3f

;const ull sed=31;

const

int mod=

1e8+7;

const

double eps=

1e-8

;const

double pi=

acos(-

1.0)

;typedef pair<

int,

int>p;

ll n,k;

bool

judge

(ll x)

return ret>=k;

}int

main()

elseif(

judge

(tot-1)

)else r=mid-1;

} cout

}

2 奇偶數分離(4分)

2 奇偶數分離 4分 題目內容 輸入n個整數 n從鍵盤輸入,假設 n的值不超過 100 按奇偶數分成兩組並輸出。輸出兩行,第一行為所有奇數,第二行為所有偶數,保持資料的相對順序與輸入順序相同。函式原型如下所示 void seperate int a,int n 陣列a存放使用者輸入的n個整數 解題思...

奇偶數分離

描述 有乙個整型偶數n 2 n 10000 你要做的是 先把1到n中的所有奇數從小到大輸出,再把所有的偶數從小到大輸出。輸入第一行有乙個整數i 2 i 30 表示有 i 組測試資料 每組有乙個整型偶數n。輸出第一行輸出所有的奇數 第二行輸出所有的偶數 樣例輸入210 14樣例輸出 1 3 5 7 9...

奇偶數分離

時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 有乙個整型偶數n 2 n 10000 你要做的是 先把1到n中的所有奇數從小到大輸出,再把所有的偶數從小到大輸出。輸入第一行有乙個整數i 2 i 30 表示有 i 組測試資料 每組有乙個整型偶數n。輸出第一行輸出所有的奇數 第二...