第一天位运算
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;
}
递归实现

浙公网安备 33010602011771号