链接:https://ac.nowcoder.com/acm/contest/370/J
来源:牛客网
题目描述
Rinne 刚刚学习了最简二次根式,于是她想用程序实现一个。
为了简化问题,在本题中,最简二次根式 a√bab 的定义为:
不存在b的一个因子k s.t. ∃x∈N∗,x2=k不存在b的一个因子k s.t. ∃x∈N∗,x2=k
即根号下的数字不含平方数因子。
举个最简二次根式的例子:√5,√200501175,20050117
举个不是最简的例子:√20,√44420,444
现在 Rinne 给了你形如 √nn 的式子中的 n,让你输出化简后的结果 a√bab 中的 a,b,如果这样的式子在实数范围内没有意义,输出 -1。
输入描述:
第一行一个整数 T,表示数据组数。 接下来 T 行,每行一个整数 x 表示根号下的数。
输出描述:
输出一共 T 行,每行两个数表示 √xx 化简后的答案 a,b
示例1
输入
复制
4 20 25 -2005 11
输出
复制
2 5 5 1 -1 1 11
说明
20=4×520=4×5 25=5×525=5×5 实数范围内 √nn中 n 小于 0 没有意义。 11 是个质数。
备注:
T≤100,0<|x|≤107
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define INF 2147483647
#define N 1005
using namespace std;
const int maxn =1e7+10;
bool isPrime[maxn];
int prime[maxn];
int top;
int is(int x)
{
if(x==1)
return 0;
if(x==2)
return 1;
for(int i=2; i<=sqrt(x); i++)
{
if(x%i==0)
return 0;//非素数
}
return 1;
}
struct node
{
int x,y;
node(int xx,int yy):x(xx),y(yy) {}
};
node ok(int x)
{
int b=1,i=1;
while(x>i*i)
{
i+=1;
while(x%(i*i)==0)
{
b*=i;
x=x/(i*i);
}
}
node n=node(b,x);
return n;
}
void init()
{
memset(isPrime,true,sizeof(isPrime));
isPrime[0]=isPrime[1]=false;
top=0;
for(int i=2; i<maxn; i++)
{
if(isPrime[i])
{
prime[top++]=i;
for(int j=i+i; j<maxn; j+=i)
{
isPrime[j]=false;
}
}
}
}
int main()
{
//init();
int t;
cin>>t;
while(t--)
{
int x;
cin>>x;
if(x<0)
{
cout<<"-1"<<endl;
continue;
}
else
{
if(is(x))
{
cout<<"1"<<" "<<x<<endl;
continue;
}
else
{
node k=ok(x);
cout<<k.x<<" "<<k.y<<endl;
}
}
}
}