問題 I 組合數學 取數問題

2022-04-08 14:55:25 字數 1710 閱讀 6766

題目描述

任給出正整數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名軍官來自不同的部隊並且軍銜各不相同。令他惱火的是,無論怎麼絞盡腦汁也排不成。後來,他去求教瑞士著名的大數學家...