weinan030416

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

数的拆解

问题描述

给定 T 个正整数 ��ai, 分别问每个 ��ai 能否表示为 �1�1⋅�2�2x1y1x2y2 的形式, 其中 �1,�2x1,x2 为正整数, �1,�2y1,y2 为大于等于 2 的正整数。

输入格式

输入第一行包含一个整数 T 表示洵间次数。

接下来 T 行, 每行包含一个正整数 ��ai 。

输出格式

对于每次询问, 如果 ��ai 能够表示为题目描述的形式则输出 yes, 否则输出 no.

样例输入

7
2
6
12
4
8
24
72

样例输出

no
no
no
yes
yes
no
yes
复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;

bool not_prime[4010];
int prime[4010], tot;
void init(int n)
{
    for(int i = 2; i <= n; i++)if(!not_prime[i])
    {
        prime[++tot] = i;
        for(int j = i + i; j <= n; j += i)
            not_prime[j] = 1;
    }
}
//判断平方数
inline bool square_number(ll x)
{
    ll y = sqrt(x);
    while(y * y <= x)//开平方存在精度误差,需要多判断几步
    {
        if(y * y == x)return true;
        y += 1;
    }
    return false;
}
//判断立方数
inline bool cubic_number(ll x)
{
    ll y = pow(x, 1.0 / 3);
    while(y * y * y <= x)//开立方存在精度误差,需要多判断几步
    {
        if(y * y * y == x)return true;
        y += 1;
    }
    return false;
}

int main()
{
    //预处理4000以内的素数
    init(4000);
    int T;
    cin >> T;
    while(T--)
    {
        ll a;
        cin >> a;
        //先特判平方数、立方数
        if(square_number(a) || cubic_number(a))
        {
            cout<<"yes"<<endl;
            continue;
        }
        bool flag = true;
        for(int i = 1; i <= tot; i++)if(a % prime[i] == 0)
        {
            int mi = 0;
            while(a % prime[i] == 0)a /= prime[i], mi++;
            //幂次必须大于1
            if(mi == 1){flag = false; break;}
        }
        //剩余的部分再次判断平方数和立方数
        if(flag && (square_number(a) || cubic_number(a)))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}
复制代码

 

 

posted on   楠030416  阅读(52)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示