https://vjudge.net/problem/LightOJ-1220
求x=bp中最大的p,x可能为负数。
因数分解,x=p1x1*p2x2*...*pnxn
x=(p1x1'*p2x2'*...*pnxn')q
如果x是正数的话,那么这个q最大就是gcd(x1,x2...xn),也就是答案了。
如果x是负数,那么q显然应该是个奇数,让求得的q不断/2直至为奇数即可。
题目明明说了x的范围在32为之内搞不懂为什么开LL才能过c。
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 #include<cstdio> 5 #include<stack> 6 #include<set> 7 #include<map> 8 #include<cmath> 9 #include<ctime> 10 #include<time.h> 11 #include<algorithm> 12 using namespace std; 13 #define mp make_pair 14 #define pb push_back 15 #define debug puts("debug") 16 #define LL long long 17 #define pii pair<int,int> 18 #define eps 1e-12 19 20 int gcd(int a,int b){ 21 return b==0?a:gcd(b,a%b); 22 } 23 24 int main() 25 { 26 int n,m,i,j,k,t; 27 int cas=0; 28 cin>>t; 29 while(t--){ 30 int p=0; 31 LL x; 32 bool fs=0; 33 scanf("%lld",&x); 34 if(x<0) x=-x,fs=1; 35 int m=sqrt(x); 36 for(i=2;i<=m;++i){ 37 if(x%i==0){ 38 int tmp=0; 39 while(x%i==0){ 40 tmp++; 41 x/=i; 42 } 43 p=gcd(p,tmp); 44 } 45 } 46 if(!p) p++; 47 if(fs) { 48 while(p%2==0) p/=2; 49 } 50 printf("Case %d: %d ",++cas,p); 51 } 52 return 0; 53 }