zoukankan      html  css  js  c++  java
  • 「AHOI2018 初中组」根式化简(分解质因数+推性质)

    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("
    ")
    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);
    	}
    }
    
  • 相关阅读:
    【转载】行走在镜面的边缘
    Marked
    初赛知识
    【连载中】另一个宇宙
    【OI学习注意事项】
    欢迎
    [很杂的杂项] Yes, Prime Minister长难句大赏(持续更新中)
    [题解] HH的项链
    [题解] SP2713&P1415 线段树区间每个数开方+区间和
    [题解]EER1迫害
  • 原文地址:https://www.cnblogs.com/coldchair/p/12676901.html
Copyright © 2011-2022 走看看