牛客 Rinne Loves Math 化简二次根式

链接: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;

            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值