代码源 每日一题 div1 Rad

题目链接

Rad

思路

这题应该是构造+数论

先考虑 r a d ( n ) rad(n) rad(n)这个函数,什么情况下满足 r a d ( n ) < n rad(n)<n rad(n)<n,如果把n进行质因子分解的话,会变成这样的形式 p 1 k 1 ∗ p 2 k 2 ∗ . . . ∗ p n k n p_1^{k_1}*p_2^{k_2}*...*p_n^{k_n} p1k1p2k2...pnkn。可以发现,但凡有一个 k i > = 2 k_i>=2 ki>=2,那么就会有 r a d ( n ) < n rad(n)<n rad(n)<n

有了这个观察,对于n,我们只需要找一个二次项的质因子即可。即找到 n = p 2 ∗ q n = p^2*q n=p2q,那么怎么利用这个东西构造呢?

由于题目中询问的是 r a d ( a ∗ b ∗ n ) < n ( a + b = n ) rad(a*b*n)<n (a+b=n) rad(abn)<n(a+b=n),我们尽量把a,b凑成 p 2 ∗ q p^2*q p2q的形式。

那么可以构造 a = p ∗ ( p − 1 ) ∗ q , b = p ∗ q a=p*(p-1)*q, b= p * q a=p(p1)q,b=pq, 这样满足了 a + b = n a+b=n a+b=n

r a d ( a ∗ b ∗ n ) = r a d ( p ∗ ( p − 1 ) ∗ q ∗ p ∗ q ∗ p 2 ∗ q ) = r a d ( p 4 ∗ ( p − 1 ) ∗ q 3 ) = r a d ( p ∗ ( p − 1 ) ∗ q ) < p ∗ ( p − 1 ) ∗ q < n rad(a*b*n)=rad(p*(p-1)*q * p * q * p^2 * q) = rad(p^4*(p-1)*q^3) = rad(p*(p-1)*q) < p * (p-1) * q < n rad(abn)=rad(p(p1)qpqp2q)=rad(p4(p1)q3)=rad(p(p1)q)<p(p1)q<n

巧妙地构造出了一组解!

由于n的范围比较大,分解n的时候,直接分解 p 2 ( p < = 1 e 9 ) p^2(p<=1e9) p2(p<=1e9)即可。可是这样还是比较大。不妨直接枚举 < = 1 e 6 <=1e6 <=1e6的所有因子,如果它是平方因子的话,就是一组合法解,如果不是的话。就把这个因子加入 q q q,如果枚举完都找不到的话,看看n剩下的数能不能变成平方因子即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
const LL INF = 1e18;
typedef pair<int,int> PII;
using tp = tuple<int,int,int>;
bool multi = true;

LL n;
int pr[N], cnt;
bool st[N];
void get_primes(int n) {
    for(int i = 2; i <= n; i++) {
        if(!st[i]) pr[cnt++] = i;
        for(int j = 0; pr[j] * i <= n; j++) {
            st[pr[j] * i] = true;
            if(i % pr[j] == 0) break;
        }
    }
}

void solve() {
    cin >> n;
    for(int i = 0; i < cnt && pr[i] <= n; i++) {
        LL pp = (LL)pr[i] * pr[i];
        if(n % pp == 0) {
            puts("YES");
            return;
        }
        if(n % pr[i] == 0) {
            n /= pr[i];
        }
    }
    LL v = sqrt(n);
    if(v > 1 && v * v == n) puts("YES");
    else puts("NO");
    
}

int main()
{
#ifdef ONLINE_JUDGE
#else 
    freopen("F.txt", "r", stdin);
#endif
get_primes(N - 1);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 1;
    if(multi) cin >> T;
    while(T--) solve();
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值