1. 正文
模板题:分解质因数2
1.1 方法一
先用欧拉线性筛筛选出 10^7 以内的所有质数,然后仅仅用质数来做试除法,降低复杂度。
这个方法由于筛到 10^7 以内的所有质数,所以可以对10^14以内的数字进行分解。
复杂度为,其中pi为质数的数量估计,sqrt为较坏情况,正常为log。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N = 1e7 + 10;
int p[N], cnt;
bool vis[N];
void init(int maxn){
for(int i = 2;i <= maxn;i++){
if(!vis[i])
p[++cnt] = i;
for(int j = 1;p[j] <= maxn / i;j++){
vis[i * p[j]] = true;
if(i % p[j] == 0)
break;
}
}
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
init(10000000);
int n;
cin >> n;
while (n--){
long long a;
cin >> a;
for (int i = 1;i <= cnt && p[i] <= a / p[i];i++){
if (a % p[i] == 0){
int t = 0;
while (a % p[i] == 0){
t++;
a /= p[i];
}
cout << p[i] << ' ' << t << '\n';
}
}
if (a > 1){
cout << a << ' ' << 1 << '\n';
}
cout << '\n';
}
return 0;
}
模板题喜提TLE3个!!!
1.2 方法二
先用欧拉线性筛筛选出 10^7 以内的所有质数,在线性筛的的过程中,记录下每个和数x的最小质因子。
然后对x进行分解,可以 O(1) 求出最小质因子,复杂度为 O(log(a)),这个方法由于要记录每个和数的最小质因数,所以范围只有10^7。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define endl '\n'
const int N = 1e8;
int p[N], cnt;
bool vis[N];
int minp[N], down[N], up[N], idx;
void init(int maxn){
for (int i = 2;i <= 10000000;i++){
if (!vis[i]){
p[++cnt] = i;
minp[i] = i;
}
for (int j = 1;p[j] <= 10000000 / i;j++){
vis[p[j] * i] = true;
minp[p[j] * i] = p[j];
if (i % p[j] == 0){
break;
}
}
}
}
void get(long long a){
while (a > 1){
long long x = minp[a];
int t = 0;
while (a % x == 0){
t++;
a /= x;
}
++idx;
up[idx] = t;
down[idx] = x;
}
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
init(1000000);
int n;
cin >> n;
while (n--){
idx = 0;
long long a;
cin >> a;
get(a);
for (int i = 1;i <= idx;i++){
cout << down[i] << ' ' << up[i] << '\n';
}
cout << '\n';
}
return 0;
}
很明显,这种方法是能过的,因为范围只有10^7。
2. 结尾
本其内容结束啦,给个赞吧~