数论(分解质因数) - Mysterious Bacteria - LightOJ 1220
题意:
Input
输入包含多组样例T(T≤50),每个样例包括一个整数x,x的范围在32位二进制数以内, 保证x的绝对值大于等于2。
Output
对于每个样例输出最大的指数p。
Sample Input
3
17
1073741824
25
Sample Output
Case 1: 1
Case 2: 30
Case 3: 2
分析:
注意:
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+10;
int primes[N],cnt;
bool st[N];
void get_prime(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]*i<=n;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
int solve(ll x)
{
ll tmp=x;
if(x<0) x=-x;
int res=0;
int sqx=sqrt(x);
for(int i=0;i<cnt && primes[i]<=sqx;i++)
{
int p=primes[i];
if(x%p==0)
{
int cnt=0;
while(x%p==0)
{
x/=p;
cnt++;
}
res=gcd(cnt,res);
}
}
if(x>1) res=1;
if(tmp<0)
while(res%2==0) res/=2;
return res;
}
int main()
{
get_prime(N-1);
int T; cin>>T;
for(int t=1;t<=T;t++)
{
ll x; cin>>x;
printf("Case %d: %d\n",t,solve(x));
}
return 0;
}