Lightoj-1220

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\n",++cas,p);
51     }
52     return 0; 
53 }

猜你喜欢

转载自www.cnblogs.com/zzqc/p/8973228.html