HDU6623 思维题(n分解成质因子的形式,问最小的幂是多少)

题目大意:给你一个数n,把它分解为素数的幂次的乘积的形式:n=p1^e1 * p2^e2 * .......pk^ek  求最小的幂次是多少

n=le18

分析:

首先我们肯定是不可以枚举1e18的因子的,因为sqrt(1e18)=1e9 ,这样铁超时,那么1s的时间我们是可以预处理出10000以内的素数,我们首先得意思到n在10000以后的素数的幂都不可能大于5了,这很好理解(10001)^5>1e18 , 所以我们可以先用10000以内的素数算出一个最小幂 和剩余数Y, 在枚举看看后面可不可能出来4,3,2,1的幂; 这也很容易寻找,(Y^(1/4))^4==Y,就说明有4的幂 , 3,2,1同理,需要注意,在枚举3的幂的时候,sqrt()的精度会不行,所以需要二分逼近一下

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll pr[10010];
bool vis[10010];
int tot;
void init(){
    for(int i=2;i<10010;i++){
        if(vis[i]==0){
            pr[++tot]=i;
            for(int j=i*2;j<10010;j+=i)
                vis[j]=1;
        }
    }
}
bool fun(ll n){
    ll l=1,r=pow(n*1.0,1.0/3.0)+1;
    while(l<=r){
        ll mid=(l+r)>>1;
        if(mid*mid*mid==n) return 1;
        else if(mid*mid*mid>n) r=mid-1;
        else l=mid+1;
    }
    return 0;
}
int main(){
    init();
    int _; scanf("%d",&_);
    while(_--){
        ll n;
        scanf("%lld",&n);
        int ans=0x3f3f3f3f;

        for(int i=1;i<=tot;i++){
            if(pr[i]>n) break;

            int x=0;
            while(n%pr[i]==0){
                n/=pr[i];
                x++;
            }
            if(x!=0)
            ans=min(ans,x);
        }
       // cout<<n<<endl;
        if(n==1||ans==1) printf("%d\n",ans);
        else {
            ll m1=(ll)sqrt(sqrt(n*1.0)*1.0);
            ll m2=(ll)sqrt(n*1.0);
            if(m1*m1*m1*m1==n) ans=min(ans,4);
            else if(fun(n)) ans=min(ans,3);
            else if(m2*m2==n) ans=min(ans,2);
            else ans=1;
            printf("%d\n",ans);
        }
    }
}

原文地址:https://www.cnblogs.com/shuaihui520/p/11559637.html

时间: 2024-11-05 02:34:59

HDU6623 思维题(n分解成质因子的形式,问最小的幂是多少)的相关文章

cf822D(质因子)

题目链接: http://codeforces.com/problemset/problem/822/D 题意: 输入 t, l, r 求 t0·f(l)?+?t1·f(l?+?1)?+?...?+?tr?-?l·f(r) % (1e9 + 7) , 至于 f(n) 是多少还是直接去看题目描述吧, 好难说清楚: 思路: xjb 很显然将 n 分解成质因子积的形式时比的场数最少, 那么可以用prime[i] 存储 i 的最小素数因子, 然后 n 不断除 prime[n] 即可得到 n 的质因子积的

poj3993Not So Flat After All(筛法素数+分解质因子)

题目链接: 啊哈哈,点我点我 题意: 题意是给出两个数字,然后有由一分解定理得,每个数可以分解成若干质因数的乘积,这样就可以在一个n维的坐标系下表示出这个点...比如给出50和24 因为24=2^3*3^1*5^0  而50=2^1*3^0*5^2那么这两个点就可以在一个3维德坐标系下表示出这两个点..24=(3,1,0)  50=(1,0,2)  那么共同拥有的维度就是3  而两个点在n维坐标系下的距离就是|3-1|+|1-0|+|0-2|=5,这样题意完全理解... 思路: 先筛出10000

POJ2992:Divisors(求N!因子的个数,乘性函数,分解n!的质因子)

题目链接:http://poj.org/problem?id=2992 题目要求:Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation? 题目解析:这题也是TLE了无数遍,首先说一下求因子数目的函数是积性函数,积性函数即f(n)=f(a)*f(b)

HDU 3641 Treasure Hunting (二分+分解质因子)

题目链接:HDU 3641 Treasure Hunting 题意:求X!%M==0中最小的的X.其中M=a1^b1*a2^b2*a3^b3.... 思路:求余为0想到整除,即分母的因子构成的集合是分子的因子构成的集合的子集.因子又想到,任何一个整数都可以分解成若干个素数相乘. 注意:题目数据很大,查到答案时二分. AC代码: #include<stdio.h> #include<string.h> #define ll __int64 bool Prime[210]; ll nu

分解质因子(个人模版)

分解质因子: 1 memset(prime,0,sizeof(prime)); 2 memset(num,0,sizeof(num)); 3 for(int i=2;i<=5000005;i++) 4 { 5 if(prime[i]==0) 6 { 7 for(int j=i;j<=5000005;j+=i) 8 { 9 int temp=j; 10 while(temp%i==0) 11 { 12 num[j]++; 13 temp/=i; 14 } 15 prime[i]=1; 16 }

UVA10892 - LCM Cardinality(分解质因子)

题目链接 题意:输入正整数n,统计有多少对正整数a <= b,满足lcm(a, b) = n. 思路:分解质因子,然后直接暴力求出对数 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const int MA

HDU 4497 GCD and LCM(分解质因子+排列组合)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满足要求的(x, y, z)有多少组,并且要考虑顺序. 思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在.具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/

POJ 1730 Perfect Pth Powers (枚举||分解质因子)

Perfect Pth Powers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16638   Accepted: 3771 Description We say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, for some integer b, x = b3. More g

分解质因子问题

题目大意:有t(1<=t<=104)个数arr[1],arr[2]-.arr[t],设每个数是n(2<=n<=109),任务是将这个n的质因子分解出来,包括重复的质因子,时限是1000MS..比如n=18,而18=2*3*3,所以输出的结果就是2 3 3. n的范围是[2,109],很容易想到n的质因子的范围是[2,sqrt(n)],所以可以预处理出[2,sqrt(109)]的所有素数(注:sqrt()就是求解一个数的平方根),这个范围内的素数大概只有3千多个,拿这个n跟所有的素数