zoukankan      html  css  js  c++  java
  • uva 10622 Perfect Pth Powers // poj 1730 Perfect Pth Powers

    /*
    
    题目:
        给出n,问n = b^p中p符合该等式的最大值
    
    分析:
        先求出所有n的质因子,然后对这m个质因子分类统计,比如
        n = 36时,可以分成 2个2,2个3,然后求出所有这些基数的
        最大公因数gcd。另外由于有负数的存在,所以求到的gcd若
        为偶数时,需要不断除二直到为奇数为止
    
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    
    const int X = 150000;
    
    int di[50],top;
    int prime[15000],cnt;
    bool notprime[X];
    int num[X];
    int ans[50];
    
    
    void init() //筛法
    {
        cnt = 0;
        memset(notprime,false,sizeof(notprime));
        for(int i=2;i<X;i++)
            if(!notprime[i])
            {
                prime[++cnt] = i;
                for(int j=i+i;j<X;j+=i)
                    notprime[j] = true;
            }
    }
    
    int gcd(int a,int b)
    {
        if(a==0)
            return b;
        return gcd(b%a,a);
    }
    
    int main()
    {
        freopen("sum.in","r",stdin);
        freopen("sum.out","w",stdout);
        long long n;
        int half;
        init();
        while(cin>>n,n)
        {
            memset(num,0,sizeof(num));
            long long temp = max(n,-n);
            half = (int)sqrt(temp*1.0);
            top = 0;
            for(int i=1;prime[i]<=half+1;i++)   //求出所有质因数
                if(temp%(long long)prime[i]==0)
                {
                    temp /= prime[i];
                    di[++top] = prime[i];
                    i--;
                    num[di[top]]++;
                    if(!temp||temp==1)
                        break;
                }
            if(top==0)
            {
                printf("1\n");
                continue;
            }
    
            memset(ans,0,sizeof(ans));
            int head = 0;
    
            for(int i=1;i<=top;i++)
                ans[++head] = num[di[i]],num[di[i]] = 0;
            int res = ans[1];
            for(int i=2;i<=head;i++)
            {
                res = gcd(res,ans[i]);
                if(res==1)
                    break;
            }
            if(n<0)
            {
                if(res%2==0)
                {
                    while(res%2==0)
                        res >>= 1;
                    printf("%d\n",res);
                }
                else
                    cout<<res<<endl;
            }
            else
                printf("%d\n",res);
        }
        return 0;
    }
  • 相关阅读:
    appium 搭建及实例
    appium运行时每次默认弹出appiumsetting与unlock重装,关闭这两个步骤的方法
    APPIUM
    分析DuxCms之AdminController
    分析DuxCms之AdminUserModel
    THINKPHP 调试------输出sql语句
    html 标签内联元素和块元素分类【转】
    thinkphp实现数据分页
    thinkphp框架实现删除上传的文件
    初入thinkphp
  • 原文地址:https://www.cnblogs.com/yejinru/p/2551421.html
Copyright © 2011-2022 走看看