其實題目描述這麼長,就是嚇你的,其實就是個簡單的組合數問題或者是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 高精度...