題目描述
小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。輸出第一行輸出所有的奇數 第二...