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;
}
posted @ 2022-05-20 23:40  knowei  阅读(196)  评论(0编辑  收藏  举报