素数筛
#include <iostream>
#include<cstring>
#include <vector>
#include <cmath>
#include <cstdio>
using namespace std;
const int N = 1e6+10;
bool isp[N];
vector<int> prime;
void check(int a,int n)
{
memset(isp, true , sizeof isp);
isp[0]=isp[1]=0;
for (int i = a; i <= n; i++)
{
if (isp[i])
prime.push_back(i);
for (int j = 0; j < prime.size() && prime[j] * i <= n; j++)
{
isp[prime[j] * i] = 0;
if(i%prime[j]==0)break;
}
}
}
int main()
{
int a,n;
cin>>a>>n;
check(a,n);
for(int i=0;i<prime.size();i++)cout<<prime[i]<<endl;
return 0;
}
用于筛出某一区间中的素数 复杂度O(n)
#include <bts/stdc++.h>
using namespace std;
bool isprime(int n)
{
for(int i=2;i<=n/i;i++)
if(n%i==0)return 0;
return 1;
}
int main()
{
return 0;
}
单独质数的判断
约数
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int>prime;
void func(int n)
{
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
prime.push_back(i);
n/=i;
}
}
if(n!=1)prime.push_back(n);
return ;
}
int main()
{
int n;
cin>>n;cout<<n<<'=';
func(n);
for(int i=0;i<prime.size()-1;i++)cout<<prime[i]<<'*';
cout<<prime[prime.size()-1];
cout<<endl;
return 0;
}
分解质因数 分出质因数单独储存 ,如果需要求它的次方采用下面的方法:
vector<pair<int,int> >p;
void func(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
int exp=0;
while(n%i==0)
{
exp++;
n/=i;
}
p.push_back({i,exp});
}
}
if(n!=1)p.push_back({n,1});
return ;
}
由上,我们可以十分轻松的求出某个数的质因数,将其分解为质因数的乘积的形式。通过他们可以确定约数个数和约数和
约数个数
约数个数=质因数幂加一的连乘
//给定十个数 求他们的乘积的所有因子的个数%10
//约数和定理
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e4 + 10;
int arr[N];
void f(int n)
{
int flag = 1;
for (int i = 2; i <= n / i; i++)
{
if (n % i == 0)
{
flag = 0;
break;
}
}
if (flag)
{
arr[n]++;
return;
}
for (int i = 2; i <= n / i; i++)
{
if (n % i == 0)
{
int exp = 0;
while (n % i == 0)
{
exp++;
n /= i;
}
arr[i] += exp;
}
}
//if放于for循环外 对其做最后的 处理
if (n != 1)
arr[n]++;
}
int main()
{
for (int i = 0; i < 10; i++)
{
int t;
cin >> t;
if (t == 1)
continue;
f(t);
}
int ans = 1;
for (int i = 2; i < N; i++)
{
if (arr[i] == 0)
continue;
//cout<<arr[i]<<endl;
ans = (arr[i] + 1) * ans % 10;
}
cout << ans % 10 << endl;
}
//使用时 只需要求出各个质因数的幂 再加1后连乘即可
约数和
求一个数所有约数的和,是各个质因数各次幂的和的乘积
#include <iostream>
#include <cstdio>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10, mod = 9901;
typedef pair<int, int> PII;
PII p[N];
int len;
void que(int n)
{
len = 0;
for (int i = 2; i <= n / i; i++)
{
if (n % i == 0)
{
int exp = 0;
while (n % i == 0)
{
exp++;
n /= i;
}
p[len++] = {i, exp};
}
}
if (n != 1)
{
p[len++] = {n, 1};
}
}
int mpow(int n, int p)
{
int ans = 1;
//n=n%mod;
while (p)
{
if (p & 1)
ans = ans * n % mod;
n = n * n % mod;
p >>= 1;
}
return ans;
}
int f(int p, int n)
{
if (p == 0)
return 0;
if (n == 0)
return 1;
if (n & 1)
return ((1 + mpow(p, n / 2 + 1)) % mod * f(p, n / 2) % mod) % mod;
else
return ((1 + mpow(p, n / 2 + 1)) % mod * f(p, n / 2 - 1) + mpow(p, n / 2) % mod) % mod;
}
signed main()
{
int a, b;
while (cin >> a >> b)
{
if (a == 0)
{
puts("0");
continue;
}
// memset(p,0,sizeof p);
que(a);
int ans = 1;
for (int i = 0; i < len; i++)
{
int x = p[i].first, y = p[i].second * b;
ans = ans * (f(x, y) % mod) % mod;
}
cout << ans << endl;
}
return 0;
}
计算一个质因数的各次幂的和需要运用快速幂以及二分递归。
快速幂
int mpow(int n, int p)
{
int ans = 1;
//n=n%mod;
while (p)
{
if (p & 1)
ans = ans * n % mod;
n = n * n % mod;
p >>= 1;
}
return ans;
}
二分递归求等比数列
int f(int p, int n)
{
if (p == 0)
return 0;
if (n == 0)
return 1;
if (n & 1)
return ((1 + mpow(p, n / 2 + 1)) % mod * f(p, n / 2) % mod) % mod;
else
return ((1 + mpow(p, n / 2 + 1)) % mod * f(p, n / 2 - 1) + mpow(p, n / 2) % mod) % mod;
}
终止条件为指数为0返回1 ,一个简单的合并同类相