题意:
给一个x,问让它被表示成b^p(b的p次方)。p最大是多少。
思路:
将x分解,得到质因子以及个数。
我们知道x是每个质因子幂的乘积,所以要使得p最大,就是幂最大。
最大其实就是这些质因子个数的最大公约数。
因为超过的就变成乘积放进去。
然后要注意这题输入的x可能是负数。
负数的话要去掉2的约数。
代码:
#include"cstdio" #include"cstring" #include"cmath" #include"cstdlib" #include"algorithm" #include"iostream" #include"map" #include"queue" #define ll long long using namespace std; #define MAXN 1000007 bool mark[MAXN]; int ss[MAXN],sscnt; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } void ssb() { sscnt=0; memset(mark,false,sizeof(mark)); mark[0]=mark[1]=true; for(int i=2; i<=MAXN; i++) { if(!mark[i]) { for(int j=i+i; j<=MAXN; j+=i) mark[j]=true; ss[sscnt++]=i; } } return ; } int main() { int t,cas=1; cin>>t; ssb(); while(t--) { ll n; int f=0; scanf("%lld",&n); if(n<0) f=1,n=-n; int ans=0; for(int i=0; i<sscnt; i++) { if((ll)ss[i]*ss[i]>n) break; if(n%ss[i]==0) { int tep=0; while(n%ss[i]==0) { tep++; n/=ss[i]; } if(ans==0) ans=tep; else ans=gcd(ans,tep); } } if(n!=1) ans=1; if(f) { while(ans%2==0) ans/=2; } printf("Case %d: %d\n",cas++,ans); } return 0; }
[整数分解+dfs] light oj 1220 Mysterious Bacteria
原文:http://blog.csdn.net/wdcjdtc/article/details/44653913