欧拉筛
int cnt, n;
int pri[N];
bool st[N];
void init(int n)
{
st[0] = st[1] = true;
for(int i = 2; i <= n; i ++)
{
if(!st[i]) pri[cnt ++] = i;
for(int j = 0; j < cnt; j ++)
{
if(pri[j] * i > N) break;
st[pri[j] * i] = true;
if(i % pri[j] == 0) break;
}
}
}
试除法判断素数
bool fun(int x)
{
if(x < 2) return false;
for(int i = 2; i <= x/i; i ++)
{
if(x % i == 0) return false;
}
return true;
}
分解质因数
map<int, int> cnt;
for(int i = 2; i <= x/i; i ++)
{
int num = 0;
while(x % i == 0)
{
num ++;
x /= i;
}
if(num >= 1)
cnt[i] = num;
}
if(x > 1) cnt[x] = 1;
快速幂求逆元
存在(a/b)mod m,如果b与m互质,那么除法可以转化为乘法
相当于a*x, x = b的m-2次幂,x就是mod m条件下b的逆元
试除法求全部约数
vector<int> res;
for(int i = 1; i <= x/i; i ++)
{
if(x % i == 0)
{
res.push_back(i);
if(x / i != i)
{
res.push_back(x / i);
}
}
}
试除法求约数个数
void fun(int x)
{
for(int i = 2; i <= x/i; i ++)
{
while(x % i == 0)
{
cnt[i] ++;
x /= i;
}
}
if(x > 1)
cnt[x] ++;
}
试除法求约数之和(秦九韶算法求和)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
int n;
map<int, int> cnt;
void fun(int x)
{
for(int i = 2; i <= x/i; i ++)
{
while(x % i == 0)
{
cnt[i] ++;
x /= i;
}
}
if(x > 1)
cnt[x] ++;
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
int x;
cin >> x;
fun(x);
}
ll res = 1;
for(auto [a, b]: cnt)
{
ll tem = 0;
//秦九韶算法
for(int i = 0; i <= b; i ++)
{
tem = (tem * a + 1) % p;
}
res = (res * tem) % p;
}
cout << res << endl;
return 0;
}
公式法求组合数
void init()
{
for(int i = 0; i < N; i ++)
{
for(int j = 0; j <= i; j ++)
{
if(!j) f[i][j] = 1;
else
f[i][j] = (f[i-1][j-1] + f[i-1][j]) % p;
}
}
}