题解
2024-06-17 13:10:18
发布于:广东
21阅读
0回复
0点赞
首先,我们得了解几个知识:
我们分解质因数,如果,那么Y的每一个质因子的次数都应是的倍数
如果有任何一个不是,那么.
那么如果是的话,该怎么算呢?
简单,我们把每一个质因子次数除以N乘起来就是X了!
#include <iostream>
#include <cstdio>
#include <bitset>
#include <cmath>
using namespace std;
bitset <100005> vis;//省个内存
int v[100005];
void _init(){//牢埃给我加速!!!
int n = 100000;
for(int i = 2; i * i <= n; i++){
if(!vis[i]){
for(int j = i * 2; j <= n; j += i){
vis.set(j);
}
}
}
for(int i = 2; i <= n; i++){
if(!vis[i]) v[++v[0]] = i;
}
}
int solve(){
int n, m, tmp = 1;
scanf("%d%d", &n, &m);
for(int i = 1; i <= v[0] && v[i] * v[i] <= m; i++){
int ct = 0;
while(m % v[i] == 0){//分解质因子
ct++, m /= v[i];
}
if(ct % n) return -1;//如果不能被N整除就不是X的正整次幂
if(ct){
tmp *= pow(v[i], ct / n);//除以N乘起来
}
}return (m == 1 ? tmp : -1);//如果Y除完还有剩余肯定不能是X的正整次幂给我坐下哈哈哈哈哈哈哈
}
int main(){
_init();
int t;
scanf("%d", &t);
while(t--){
printf("%d\n", solve());
}
return 0;
}
单个测试数据时间复杂度:
好了,你已经会这道题了,请做一下这道吧(
全部评论 2
这啥啊?(看不懂)
2024-06-25 来自 广东
0开根大法yyds!
2024-06-17 来自 浙江
0
有帮助,赞一个