question:
从 1∼n这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
#include <iostream>
using namespace std;
int n;
void dfs(int u, int state){
if(u == n){
for(int i = 0; i < n; i ++){
//仅仅只是表示状态
if(state >> i & 1) cout << i + 1 << " ";//从1开始
}
cout << endl;
return;
}
dfs(u + 1, state);
dfs(u + 1, state | 1 << u);
//被说多余的return...
}
int main(){
cin >> n;
dfs(0, 0);
return 0;
}
*时间:2^n.
*局部变量一般不改变
*1e5 = 2^14 1e9 = 2^27 1e20 = 2^64
SHINING:
#费马小定理 (4条消息) 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)_weixin_33963594的博客-CSDN博客
a^(p - 1) = 1(mod p)
可以对大数进行降幂(可以往上面化简)
#转化2进制
*从高位到低位(不一样哦)
#include <iostream>
using namespace std;
int main(){
int n = 6;
while(n){
int m = n >> 1 & 1;
cout << m << endl;
n >>= 1;
}
return 0;
}
#学会了快速幂