zoukankan      html  css  js  c++  java
  • 【HDOJ6623】Minimal Power of Prime(Powerful Number)

    题意:给定大整数n,求其质因数分解的最小质数幂

    n<=1e18

    思路:常规分解算法肯定不行

    考虑答案大于1的情况只有3种:质数的完全平方,质数的完全立方,以及p^2*q^3,p,q>=1三种形式

    前两种可以暴力判

    第三种必定有一个小于10^(18/5)的因子,大概是3800

    迭代分解,用vector存一下具体的情况

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef pair<int,int> PII;
      7 typedef pair<ll,ll> Pll;
      8 typedef vector<int> VI;
      9 typedef vector<PII> VII;
     10 //typedef pair<ll,ll>P;
     11 #define N  1000010
     12 #define M  200010
     13 #define fi first
     14 #define se second
     15 #define MP make_pair
     16 #define pb push_back
     17 #define pi acos(-1)
     18 #define mem(a,b) memset(a,b,sizeof(a))
     19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     21 #define lowbit(x) x&(-x)
     22 #define Rand (rand()*(1<<16)+rand())
     23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     24 #define ls p<<1
     25 #define rs p<<1|1
     26 
     27 const int MOD=1e9+7,inv2=(MOD+1)/2;
     28       double eps=1e-4;
     29       int INF=1e9;
     30       int inf=0x7fffffff;
     31       int dx[4]={-1,1,0,0};
     32       int dy[4]={0,0,-1,1};
     33 
     34 ll p[100000],mn[100000];
     35 
     36 int read()
     37 {
     38    int v=0,f=1;
     39    char c=getchar();
     40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     42    return v*f;
     43 }
     44 
     45 ll check2(ll n)
     46 {
     47     ll t=sqrt(n);
     48     if(t*t==n) return t;
     49     return 0;
     50 }
     51 
     52 ll check3(ll n)
     53 {
     54     ll t=pow(n,1.0/3)+0.5;
     55     if(t*t*t==n) return t;
     56     return 0;
     57 }
     58 
     59 VII solve(ll n)
     60 {
     61     if(n<100000000)
     62     {
     63         VII re;
     64         for(int i=1;i<=p[0]&&p[i]*p[i]<=n;i++)
     65          if(n%p[i]==0)
     66          {
     67              int s=0;
     68              while(n%p[i]==0)
     69              {
     70                  s++;
     71                  n/=p[i];
     72              }
     73              re.push_back(MP(p[i],s));
     74          }
     75         if(n>1) re.push_back(MP(n,1));
     76         return re;
     77     }
     78     int t;
     79     if(t=check2(n))
     80     {
     81         VII re=solve(t);
     82         for(int i=0;i<re.size();i++) re[i].se*=2;
     83         return re;
     84     }
     85     if(t=check3(n))
     86     {
     87         VII re=solve(t);
     88         for(int i=0;i<re.size();i++) re[i].se*=3;
     89         return re;
     90     }
     91     ll t1=0,t2=0;
     92     for(int i=1;i<=p[0]&&p[i]*p[i]*p[i]*p[i]*p[i]<=n;i++)
     93      if(n%p[i]==0)
     94      {
     95          t1=p[i];
     96          while(n%p[i]==0)
     97          {
     98              t2++;
     99              n/=p[i];
    100          }
    101          break;
    102      }
    103     if(t1==0) return VII(1,MP(0,1));
    104     VII re=solve(n);
    105     re.push_back(MP(t1,t2));
    106     return re;
    107 }
    108 
    109 
    110 int main()
    111 {
    112     //freopen("1.in","r",stdin);
    113     //freopen("1.out","w",stdout);
    114     rep(i,2,10000)
    115     {
    116          if(!mn[i])
    117          {
    118              p[++p[0]]=i;
    119              mn[i]=p[0];
    120         }
    121         for(int j=1;j<=mn[i]&&i*p[j]<=10000;j++) mn[i*p[j]]=j;
    122     }
    123     int cas=read();
    124     while(cas--)
    125     {
    126         ll n;
    127         scanf("%I64d",&n);
    128         VII t=solve(n);
    129         if(t.empty()) printf("1
    ");
    130          else
    131          {
    132              int ans=100000;
    133              for(int i=0;i<t.size();i++) ans=min(ans,t[i].se);
    134              printf("%d
    ",ans);
    135          }
    136     }
    137 
    138     return 0;
    139 }
  • 相关阅读:
    web开发(六) EL表达式
    web开发(五) JSP详解(四大作用域九大内置对象等)
    web开发(四) 一次性验证码的代码实现
    Netty4
    Android Fragment
    Android 6.0 双向通话自动录音
    安卓
    SpringMVC + Spring + Mybatis+ Redis +shiro以及MyBatis学习
    Spring 3 AOP 概念及完整示例
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
  • 原文地址:https://www.cnblogs.com/myx12345/p/11644652.html
Copyright © 2011-2022 走看看