1 条题解
-
0
自动搬运
来自洛谷,原作者为

Lord_Sky2048
**搬运于
2025-08-24 22:42:23,当前版本为作者最后更新于2022-11-26 18:04:26,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先将 进行素因子分解 ......
,要拆分成 $k_1 \times y_1 + k_2 \times y_2 = q_i,k_1,k_2\geq0,y_1,y_2\geq2$
可以保证对于 ,均有正整数解(也含0)
所以问题就被我们转换为:
能否变为
因为 所以 。
所以只需要暴力判断 以内的素因子,对于大于 的 ,指数只可能是 ,即判断一下是否为平方数或者立方数即可。
时间复杂度 。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD = 1e9 + 7; template <typename T> inline T read(T& x) { x = 0; T w = 1; char ch = 0; while (ch < '0' || ch > '9') { if (ch == '-') w = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + (ch - '0'); ch = getchar(); } return x * w; } 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 check(ll x) { ///检查平方数 ll y = pow(x, 0.5); if(y * y == x || (y + 1) * (y + 1) == x) return true; ///检查立方数 y = pow(x, 1.0 / 3); if(y * y * y == x || (y + 1) * (y + 1) * (y + 1) == x || (y + 2) * (y + 2) * (y + 2) == x) return true; return false; } int main() { init(4000); int T; read(T); while(T--) { ll x; read(x); if(check(x)) { puts("yes"); continue; } bool flag = true; for(int i = 1; i <= tot; i++)if(x % prime[i] == 0){ int now = 0; while(x % prime[i] == 0) { now++; x /= prime[i] ; } ///cout<<prime[i]<<" "<<now<<endl; if(now == 1) { flag = false; break; } } if(flag & check(x)) { puts("yes"); continue; } else { puts("no"); } } return 0; }
- 1
信息
- ID
- 7956
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者