第一天位运算

0x01:位运算

计算a * b mod p
公式a * b = a * b - [a * b / p] * p
记 c = [a * b / p]
x = a * b, y = c * p;
ans = a - y

#include<iostream>
using namespace std;
typedef unsigned long long ull;
ull mul(ull a, ull b, ull p)
{
    ull c = (long double)a * b / p;
    ull x = a * b, y = c * p;
    long long ans = (long long)(x % p) - (long long)(y % p);
    if(ans < 0)ans += p;
    return ans;
}
int main()
{
    long long a, b, p;
    cin >> a >> b >> p;
    cout << mul(a, b, p) << endl;
    return 0;
}

0x02:递推与递归
递归实现指数型枚举

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int> choose;
void solve(int u)
{
    if(u == n + 1){
        for(int i = 0; i < choose.size(); i ++ )
        {
            cout << choose[i] << ' ';
        }
        cout << endl;
        return;
    }
    solve(u + 1);
    
    choose.push_back(u);
    solve(u + 1);
    choose.pop_back();
    
}
int main()
{
    cin >> n;
    solve(1);
    return 0;
}

递归实现

posted @ 2021-07-16 09:40  梨花满地  阅读(54)  评论(0)    收藏  举报