Это Аморфофаллус был взрывным двойной сыр Li ступенчатого пряный!
На самом деле, до тех пор, как понимание будет думать, что этоназвание Sucker!
Эта тема и метка дп, поиск, теория чисел
Но вы можете использовать идею делать половину!
Решение:
Он начал перечислять наиболее значимый бит,
Мы рассматриваем каждый, не только может взять 0/1
Тогда сначала найти, когда этот бит установлен в 0, то можно сделать ряд программ (и так сказать вам, почему требования
Мы считаем, что, когда этот бит равен 0, когда этот бит, что является 1? ? ?
Мы находим его номер программы, максимальное количество, что эта программа не является, но этот бит равен 0 может быть достигнут;
Если я больше этого максимума, то этот бит равен 0, не только не делать этого.
результат:
Таким образом, если эта программа больше, чем число я, я объяснить некоторые числовые ряды среди старшего бита числа равен нулю, в противном случае она принадлежит к наиболее значащий бит имеет номер 1.
Понемногу вы считаете на него сверху вниз!
Это использование бинарного мышления, решения.
По мере увеличения числа программ, а затем снова запустить в начале дп на линии,
g[i][j] = g[i - 1][j - 1] + g[i - 1][j];
Это добавляет к значению 0/1 первого.
код:
#include<bits/stdc++.h>//万能头
using namespace std;
#define maxn 60//可以稍微大一点
#define int long long//这是个坑
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)
#define Dep(x, a, b) for(int x = a; x >= b; -- x)
int n, l, k, g[maxn][maxn], sum[maxn][maxn], a[maxn];
//g[k][i]是来表示在前k位中,恰有i个1的二进制数的数量
//sum[k][i]是来表示在前k位中,最多有i个1的二进制数的数量
//a[i]是当前这一位是0/1,输出是用。
void dfs(int x, int l, int k){
if(x == 0){//跑到了最后一位了
Dep(i, n, 1){//输出路径
printf("%d", a[i]);
}
exit(0);//不可以用return,return只结束当前这一轮函数,exit(0)就可以直接结束程序。
}
if(k <= sum[x - 1][l]){//如果它小于或等于此位取0时的最大值
a[x] = 0;//当前这位就取0;
dfs(x - 1, l, k);//并且直接跑到下一位
}
else{//如果它大于的话
a[x] = 1;//当前就取1;
dfs(x - 1, l - 1, k - sum[x - 1][l]);//并且跑下一位的时候要把还可以取的‘1’的数量-1,然后要跑的数位也会减去这位取了‘1’以后减下的值。
}
}
signed main(){
scanf("%d%d%d", &n, &l, &k);//RT
g[0][0] = 1;//初始化,一定要记得
Rep(i, 1, n){
g[i][0] = 1;//如果只要0个‘1’,肯定只有1种方法。
Rep(j, 1, n){
g[i][j] = g[i - 1][j - 1] + g[i - 1][j];//递归求恰有i个1的二进制数的数量
}
}
Rep(i, 0, n){
Rep(j, 0, n){
Rep(k, 0, j){
sum[i][j] += g[i][k];//跑一下求最多有i个1的二进制数的数量
}
}
}
dfs(n, l, k);//搜索一下就可以了
return 0;
}
Вот то, что я сказал, что дважды в Wa
Первый:
Я молю сумму [] [] время, а не от № 0 для запуска. , ,
Во-вторых:
Не открывать длинные longQAQ
Ps:Пожалуйста, перечитайте копию