码迷,mamicode.com
首页 > 其他好文 > 详细

「AHOI2018 初中组」根式化简(分解质因数+推性质)

时间:2020-04-11 00:27:40      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:ons   names   分解质因数   http   int   amp   mes   lin   print   

https://loj.ac/problem/2993

之前在哪里见过这个套路,但忘记了是在哪里了,在这里总结一下

暴力就是筛出\(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("\n")
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\n", a);
	}
}

「AHOI2018 初中组」根式化简(分解质因数+推性质)

标签:ons   names   分解质因数   http   int   amp   mes   lin   print   

原文地址:https://www.cnblogs.com/coldchair/p/12676901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!