3 条题解
-
1
#include <bits/stdc++.h> #define ll long long #define IOS ios::sync_wtih_stdio(false), cin.tie(0), cout.tie(0) using namespace std; int T; int main() { cin >> T; while (T--) { ll n; cin >> n; ll m = n; for (ll i = 2; i * i <= n; i++) { while (m % i == 0) { m /= i; cout << i << " "; } } if (m != 1) cout << m; cout << endl; } return 0; }
-
0
离谱的是这一题竟然只有1个数据题解里已经有用筛法做的了,我就提供一个不用筛法的。
首先我们从 ~ 枚举 的因数。当我们找到一个这样的因数 时,我们就让 一直除以 ,直到无法整除它为止。
需要注意这一个过程中并不需要判断 是不是质数,只要找到一个 那么它必然是质因数。证明如下:假设 不是质数, 必存在一个质因子 ,那么 ,说明我们之前就已经枚举过了 , 已经把质数 全部分解出去了,当前的 没有了 因子,
n%j
不为0,与n%i==0
矛盾!所以当n%i==0
时, 必然为一个质数。于是这一题我们就能解了,但需要注意剩下的 的情况,说明剩下的 还是质数。
部分代码:
void work(ll n){ for(ll i=2;i*i<=n;i++) while(n%i==0) printf("%lld ",i),n/=i; if(n>1) printf("%lld",n); puts(""); }
upd. 2024.3.29 更新了更短、更优的代码
-
0
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1000005; int T, m, k, L, R, ans, vis[N], pri[N]; ll n; int main(){ for (int i = 2; i <= 1000000; ++i){ if (vis[i]) continue; pri[++m] = i; // 记录质数 for (int j = i + i; j <= 1000000; j += i) vis[j] = 1; // 筛质数 } cin >> T; while (T--){ cin >> n; for (int i = 1; i <= m; ++i) // 只用质数进行试除 while (n % pri[i] == 0) cout << pri[i] << ' ', n /= pri[i]; if (n > 1) cout << n; cout << "\n"; } }
- 1
信息
- ID
- 615
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 133
- 已通过
- 52
- 上传者