0x00.基本算法
基本算法
1.位运算
1.a^b
题目描述
就是让我们求\(a^b mod p\)的值
数据范围为
\(0≤a,b≤10^9 1≤p≤10^9\)
样例
输入
3 2 7
输出
2
算法1
数学问题
模板题,快速幂算法
例如求,3^11
3^11 = 3^1 * 3^2 * 3^8
我们可以把7转换为二进制 1011, 可以看出我们只需把进制上面为1的值进行相乘即可,为0的忽略即可,我们只需循环4次即可把3^11求出来。
C++ 代码
#include<iostream>
#define ll long long
using namespace std;
int a, b;
int mod;
ll qmi(int m, int k, int p)
{
ll res = 1 % p, t = m;
while (k)
{
//使用与运算将改为取出来判断是否为1
if (k&1) res = res * t % p;
//求出改为对应的次方
t = t * t % p;
//右移一位,将后面一位移到当前位置
k >>= 1;
}
return res;
}
int main()
{
cin >> a >> b >> mod;
cout << qmi(a, b, mod);
return 0;
}
2.递推与递归
1.递归实现指数型枚举
题目描述
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
样例
输入
3
输出
3
2
2 3
1
1 3
1 2
1 2 3
算法
思路
因为是从n个数中随机选任意多个,所以我们可以使用2进制的形式来代表选和不选当前位置,比如101,即为选择1 3两个数
C++代码
#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 15;
int n;
int cnt;
int ans[N];
void dfs(int x, int state)
{
if(x == n)
{
for(int i = 0; i < n; i++)
if(state >> i & 1)
cout << i + 1 << " ";
cout << endl;
return;
}
dfs(x + 1, state);
dfs(x + 1, state + (1 << x));
}
int main()
{
cin >> n;
dfs(0, 0);
return 0;
}