作為乙個神秘的電腦高手,farmer john 用二進位制數字標識他的奶牛。
然而,他有點迷信,標識奶牛用的二進位制數字,必須只含有k位「1」 (1 <= k <= 10)。 當然,每個標識數字的首位必須為「1」。
fj按遞增的順序,安排標識數字,開始是最小可行的標識數字(由「1」組成的乙個k位數)。
不幸的是,他沒有記錄下標識數字。請幫他計算,第n個標識數字 (1 <= n <= 10^7)。
第1行:空格隔開的兩個整數,n和k。
=10.5pt如題,第n個標識數字
7 3
10110對於第乙個數,一定是k個1。
考慮每次加入多乙個0,設當前加入了i個0,因為第乙個位置一定是1,所以有k個空位,每個位置可以不放0。
那麼轉換為插板問題,一共i+k-1個空隙,放k-1個擋板,方案是c( i+k-1 , k-1 )。
預處理出組合數後,列舉i(或者二分)可以求出對於第n個k位1的數一共有幾個0在原數**現。
同樣列舉當前這個0放在哪個1後面,設現在我們有 t 個0要放,我們要找到第x大的放t個0數
對於第 now 個1,如果放了1個0在第now個1後面,那麼:
剩下:t-1個0,k-now+1個空隙,一共有c( k-now+1 + t-1 -1 , k-now+1 -1 )=c( k-now+t-1 , k-now )種放法。
如果剩下的放法大於等於x,那麼就在當前1後面放乙個0,
如果剩下的放法比x小,那麼我們就把所有的放在第now個1的放法放完,即x-=c( k-now+t-1 , k-now ),然後這個1後面就不妨0了,繼續放下乙個1,這樣就能保證原數變大了,進而找到第x大的數。最後把所有1帶著其後面跟著有多少個0輸出即可。
#include#include#include#define i int
#define ll long long
#define f(i,a,b) for(i i=a;i<=b;i++)
#define fd(i,a,b) for(i i=a;i>=b;i--)
using namespace std;
i n,k,now,x,t,a[55];
ll f[100011][12];
i main()
f(i,0,100000)
f(i,1,100000)
} if(!x)
now=1;
while(t)
else
} f(i,1,k)
return 0;
}
noip模擬賽 bzoj2932旅行
題解 話說這道題啊,是真的坑,正解不難,但是想歪是很簡單的,在常規的貪心不行的時候,本人就想到了dp,自我感覺 非常有道理,方程式也寫了出來,結果莫名wa了50 的資料,不懂,聽大牛說是因為不滿足最優子結構。表示 寫dp的時候從來沒有關注過這個東西 先說dp吧,dp i j 表示前i個人,有j個人在...
NOIP模擬測試8
hz怎麼老考試啊23333 考試前一天占個坑。給自己的忠告 想不出正解就別想了,暴力打滿rank就不會難看qaq 華麗的分割線 考完了,rank14,我又boomboomboom了orz 最後t3的暴力還是沒打出來,我就是個想不出正解還要ning想的dd 我是sb 一眼kmp,剛正不阿的cwy不會忘...
NOIP2012模擬10 25 旅行
給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...