我们预处理一个数组dp[i][j]表明在i位二进制数里有j个1的二进制个数
然后,for i in [0, n],求出s=sum(F[i, 0~L])。如果这个和大于t,就说明我们要求的这个数字包含在num[k]=1里。把t扣除掉num[i]=0的情况,也就是扣掉s。
//usaco3-2-2 01串
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
ll dp[1010][1010];
int n,l;
ll t;
int num[51];
void dfs(int n,int l,ll t)
{
if (!t) return;
ll cur,s=0;
for (int i=0;i<=n;i++)
{
cur=s;s=0;
for (int j=0;j<=l;j++) s+&