NOIP2006 2 k進製數

2021-08-09 15:19:04 字數 1488 閱讀 6167

其實題目描述這麼長,就是嚇你的,其實就是個簡單的組合數問題或者是dp,只是要加上乙個高精而已。

我們發現這個方案數等價於 ∑[

wk]i

=2ci

2k−1

然後[w

k]不整除的部分所餘留下來的部分等於:

設r為剩餘的位數∑2

r−1i

=1c[

wk]2

k−i−

1 然後寫個高精,注意要壓位,跟普通的高精不同的是輸出要補前導零。

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

#define rep(i,a,b) for(register int i = (a),i##_end_ = (b); i <= i##_end_; ++i)

#define drep(i,a,b) for(register int i = (a),i##_end_ = (b); i >= i##_end_; --i)

#define mem(a,b) memset(a,b,sizeof(a))

template

inline

bool chkmin(t &a,const t &b)

template

inline

bool chkmax(t &a,const t &b)

int read()

while(isdigit(c))

return f * s;

}const

int n = 521;

int k,w;

//ll c[maxn][maxn];

const

int base = 10000;

struct bigint

void print()

}void

operator = (int val)

while(val);

}}c[n][n];

#define t bigint

t operator + (t u,t v)

while(res.x[res.len])

return res;

}void solve_80point()

int main()

t res;res.clear();

rep(i,1,n-1)rep(j,1,i)c[i][j] = c[i-1][j-1]+c[i-1][j];

rep(i,2,w/k)if((1

<1>=i)res = res + c[(1

<1][i];

if(w%k)

res.print();

return

0;}

NOIP2006 2 k進製數

設r是個 2 k 進製數,並滿足以下條件 1 r至少是個2位的 2 k 進製數。2 作為2 k 進製數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。3 將r轉換為2進製數q後,則q的總位數不超過w。在這裡,正整數k 1 k 9 和w k w 30000 是事先給定的。問 滿足上述條件的不同的...

noip2006 2 k進製數

描述 設r是個2 k 進製數,並滿足以下條件 1 r至少是個2位的2 k 進製數。2 作為2 k 進製數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。3 將r轉換為2進製數q後,則q的總位數不超過w。在這裡,正整數k 1 k 9 和w k w 30000 是事先給定的。問 滿足上述條件的不同...

NOIP2006 2 k進製數

題目描述 問有多少個 2 k k leq 9 進製數滿足 至少有 2 位 轉化為 2 進製數之後最多有 w 位。除最後一位外,每一位都嚴格小於右邊一位 輸入樣例 3 7 輸出樣例 36 考點 動態規劃 or 組合數學 高精度 做法 string add string sa,string sb 高精度...