题目大意:
给你一个数x = b^p,求p的最大值
x = p1^x1*p2^x2*p3^x3*...*ps^xs
开始我以为是找x1、x2、... 、xs中的最大值,后来发现想错了,x = b^p, x只有一个因子的p次幂构成
如果x = 12 = 2^2*3^1,要让x = b^p,及12应该是12 = 12^1
所以p = gcd(x1, x2, x3, ... , xs);
比如:24 = 2^3*3^1,p应该是gcd(3, 1) = 1,即24 = 24^1
324 = 3^4*2^2,p应该是gcd(4, 2) = 2,即324 = 18^2
Each case starts with a line containing an integer x. You can assume that x will have magnitude at least 2(被这坑了) and be within the range of a 32 bit signed(有符号) integer.
狗屎题,本题有一个坑,就是x可能为负数,如果x为负数的话,x = b^q, q必须使奇数,所以将x转化为正数求得的解如果是偶数的话必须将其一直除2转化为奇数
#include <iostream>
#include<stdio.h>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll prime[1000006],t,n,ans,isprime[1000006],top,ss[1000006];
void check()
{
for(int i=2; i<1000006; i++)
{
if(isprime[i]==0)
prime[ans++]=i;
for(int j=0; j<ans&&i*prime[j]<1000006; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}//线性筛,通过这个题我知道线性筛比我之前打的那个快
bool cmp(ll a,ll b)
{
return a>b;
}
ll gcd(ll a,ll b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
check();
scanf("%lld",&t);
while(t--)
{
int flot=1;
scanf("%lld",&n);
if(n<0)
{
n=-n;
flot=0;
}
memset(ss,0,sizeof(ss));
printf("Case %lld: ",++top);
for(int i=0; i<ans; i++)
{
while(n%prime[i]==0)
{
n/=prime[i];
ss[i]++;
}
}
if(n!=1)
ss[ans]=1;
sort(ss,ss+ans+1,cmp);//如果不存排序的话,普通筛就过
ll sum=ss[0];
for(int i=1; i<ans+1; i++)
{
if(ss[i]==0)
break;
sum=gcd(sum,ss[i]);
}
if(flot==0)
{
while(sum%2==0)
sum/=2;
}
printf("%lld\n",sum);
}
return 0;
}