題目描述
任給出正整數n和k(1
<=n<=1,
000,
000,
0<=k<=n),取數規則如下:
例如n=
16,k=
4第一次取數 1 取數後的餘數為16-1
=15第二次取數 2 取數後的餘數為15-2
=13第三次取數 4 取數後的餘數為13-4
=9第四次取數 8 取數後的餘數為 9-8
=1當第五次取數時,因為餘數是1,不夠取,此時作如下處理
餘數1+k=
5,再從1開始取
第五次取數 1 取數後的餘數為5-1
=4第六次取數 2 取數後的餘數為4-2
=2由於第七次取數4,但餘數為2,又得重新加k,2+4
=6,再從1開始取
第七次取數 1 取數後的餘數為 6-1
=5第八次取數 2 取數後的餘數為 5-2
=3第九次取數 4 但不夠取3+
4=7第九次取數 1 取數後的餘數為 7-1
=6第十次取數 2 取數後的餘數為 6-2
=4第十一次取數 4 取數後的餘數為 4-4
=0 正好取完
由此可見,當n=
16,k=
4時,按上面方法11次取完
輸入兩個int型別的正整數,n和k。
輸出如果正好取完,輸出按照取數規則取完所需要的取數次數。如果永遠不能取完時,輸出」bad number!」。
樣例輸入
複製樣例資料164
樣例輸出
11
設餘數為 res
按照規則, 每次剪掉的數是2 ^ 0 , 2 ^ 1 , 2 ^ 2 , 2 ^ 3 … 2 ^ i , 這個2 ^( i + 1 )> res ,故而不能再減了, 前 i 項我們可以直接用等比做一下 , 我是提前存起來的,然後後面直接相減 , 但是這樣的話, 會有乙個問題, 我們要迴圈多少次,才能最後按照規則得出0 呢, 這個還真不知道,
不過可以發現我們先找出乙個規律, 根據等比數列公式, 前i + 1項和 為2 ^(i + 1) - 1 . 比2 ^ (i + 1) 少了 1 , res <= 2 ^ (i + 1) - 1. 我們可以發現res 不超過一半大小, 也就是如果res >= 2 ^ (i + 1) , 我們可以直接減掉2 ^ (i + 1) , 也就保證了res < 2 ^ (i + 1) , =額, 還真有點說不清,
看樣例14 6 第一次拿 1 , 2 ,4 ,剩下 7, 下面不夠拿8的了, 然後再加上k重新拿, 一次模擬下去可以發現 ,每次剩下的餘數真的不超過n的一半大小,那麼再加上k,就是不超過k + n / 2, 最後為0 . 會去拿多少次? 每次相當於取走一半, 不回超過k + n / 2 次, 列舉這些遍就行了,如果最後是0 , 可以拿完, 同時記錄一下拿了多少次, 如果不是,就是bad
#include
#include
using namespace std;
int b[31]
, n , k ;
intmain()
if(!res)
break;}
if(res)
puts
("bad number!");
else
printf
("%d\n"
, total)
;return0;
}
組合數學問題
監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 6種狀態為 000 001 011 ...
組合數學 購票問題
購票問題 題目大意 一張票50元,有n個帶著50元的人和n個帶著100元的人,請問總共有多少種排隊方法使得不會出現購票找不回錢的尷尬局面?輸入樣例 2 輸出樣例 2 這是一類非常有代表性的問題,下面將介紹該問題的5種解法 number 5 暴力列舉 很顯然,要使帶著100元的購票那麼就需要50的去找...
組合數學 36軍官問題
據說普魯士的腓特列大帝曾組成一支儀仗隊,儀仗隊共有36名軍官,來自6支部隊,每支部隊中,上校 中校 少校 上尉 中尉 少尉各一名。他希望這36名軍官排成6 6的方陣,方陣的每一行,每一列的6名軍官來自不同的部隊並且軍銜各不相同。令他惱火的是,無論怎麼絞盡腦汁也排不成。後來,他去求教瑞士著名的大數學家...