Mysterious Bacteria 唯一分解定理+素數篩
阿新 • • 發佈:2018-12-02
題目大意:
給你一個數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; }