「AHOI2018 初中组」根式化简(分解质因数+推性质)
Posted coldchair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「AHOI2018 初中组」根式化简(分解质因数+推性质)相关的知识,希望对你有一定的参考价值。
之前在哪里见过这个套路,但忘记了是在哪里了,在这里总结一下
暴力就是筛出(n^{frac{1}{3}})里的所有质数,然后用它们去分解。
这个有(80p)。
事实上,我们可以只用(n^{frac{1}{4}})内的质数去分解,对于分解剩下的那个数(x)。
(x)的最小质因子(>n^{frac{1}{4}}),所以它最多有(4-1=3)个质因子。
所以它要是想有一个(3)次以上的质因子,就只能是(x^{frac{1}{3}})。
这样就可以过了。
Code:
#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, _b = y; i <= _b; i ++)
#define ff(i, x, y) for(int i = x, _b = y; i < _b; i ++)
#define fd(i, x, y) for(int i = x, _b = y; i >= _b; i --)
#define ll long long
#define pp printf
#define hh pp("
")
using namespace std;
const int N = 31635;
int bz[N]; ll p[N], w[N], p0;
int n; ll x;
int main() {
n = 31630;
fo(i, 2, n) fo(j, 2, n / i) bz[i * j] = 1;
fo(i, 2, n) if(!bz[i]) p[++ p0] = i;
fo(i, 1, p0) w[i] = p[i] * p[i] * p[i];
for(scanf("%d", &n); n; n --) {
scanf("%lld", &x);
ll a = 1;
for(int i = 1; i <= p0 && x >= w[i]; i ++) {
while(x % w[i] == 0) x /= w[i], a *= p[i];
while(x % p[i] == 0) x /= p[i];
}
ll y = round(pow(x, (double) 1 / 3));
if(y * y * y == x) a *= y, x = 1;
pp("%lld
", a);
}
}
以上是关于「AHOI2018 初中组」根式化简(分解质因数+推性质)的主要内容,如果未能解决你的问题,请参考以下文章