DP预处理+贪心
首先设$f[i][j]$表示长度为$i$的01串中有不大于$j$个1,然后显然
$f[i][j]=\sum_{k=1} ^{j} C[i][k]$
$C[i][j]=C[i-1][j-1]+C[i-1][j]$
DP预处理结束。
通过DP预处理出的数不断把编号缩小。
显然存在的是,如果$f[i-1][L]<I$,那么第$i$位就是1,否则即为0。
//OJ 1847 //by Cydiater //2015.9.22 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll N,L,I,f[][]; namespace solution{ void init(){ N=read();L=read();I=read(); memset(f,,sizeof(f)); } void slove(){ up(i,,)f[i][]=; up(i,,N)up(j,,L)f[i][j]=f[i-][j-]+f[i-][j]; up(i,,N)up(j,,L)f[i][j]+=f[i][j-]; down(i,N,) ][L]<I&&I>){ printf("); I-=f[i-][L]; L--; //cout<<i<<' '<<L<<' '<<f[i-1][L]<<' '<<I<<endl; }"); } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); ; }
需要注意的是,要把数据开到long long