Mysterious Bacteria
题目
意思就是给一个数x,现在要将它表示称次方形式,问最高能表示成多少次方?
比如: 25 最高能表示成,它的次方形式表示最高是2次方
分析
这题最开始我写成了二分,按理说是可以过的,但是被WA飞了。
好了,现在讲质因数分解做法。
我们对N进行质因数分解的:
那么如果我们想要讲底数变成一个数,那么我们可以将次方的gcd提取出来,将剩余的数相乘,就比如:
如果N是正数,那么答案就是质因数分解后各个质因数幂的gcd
如果是负数,我们需要将上面得出的gcd减小到最大的一个奇数,so只要不断除以2就行,直到不能够再整除
AC 代码
#include <algorithm> #include <stdio.h> #include <cmath> using namespace std; typedef long long ll; const ll maxn = (1LL<<16)+10; ll T,N; ll P[maxn],tail; bool vis[maxn]; ll gcd(ll a,ll b){ return !b?a:gcd(b,a%b); } void init(){ for(ll i = 2;i<maxn;i++){//素数筛选 if(!vis[i]){ P[tail++] = i; for(ll j = i*i;j<maxn;j+=i){ vis[j] = true; } } } } ll solve(){ int tag = 1; if(N<0){ N = - N; tag = -1; } ll g = 0; for(ll i = 0;i<tail && P[i]*P[i]<=N;i++){ if(N%P[i] == 0){ ll cnt = 0; while(N%P[i] == 0){ cnt++; N/=P[i]; } g = gcd(g,cnt); } } if(N>1) g = gcd(g,1); if(tag == -1){ //如果是奇数 while(g%2 == 0){ g/=2; } } return g; } int main(){ init(); cin>>T; int kase = 0; while (T--){ scanf("%lld",&N); printf("Case %d: %lld\n",++kase,solve()); } return 0; }