LightOJ1220
2024-09-06 11:35:53
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1220
题目大意:
给你一个 x,请求出一个最大的 p 使得 np = x(n为任意整数)。注意,x 有可能是负数。
解题思路:
算术基本定理。
求出 |x| 的唯一分解式,然后求各项指数的最大公因数。如果 x<0,那么还要事先将分解式的每一项的指数都转化成奇数(负数的偶数次方就变成正数了嘛)。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath> using namespace std;
typedef long long ll;
const int maxn = 1e5;
bool not_prime[maxn];
int prime[maxn];
int cnt;
void init(){
cnt=;
not_prime[]=not_prime[]=true;
for(ll i=;i<maxn;i++){
if(!not_prime[i]){
prime[cnt++]=i;
for(ll j=i*i;j<maxn;j+=i)
not_prime[j]=true;
}
}
}
int gcd(int a,int b){
if(b==) return a;
return gcd(b,a%b);
}
int ind[maxn];
int solve(ll x){
bool fu=false;
if(x<){
fu=true;
x=-x;
}
int tmp=;
for(int i=;i<cnt;i++){
if(x%prime[i]==){
ind[tmp]=; x/=prime[i];
while(x%prime[i]==){
ind[tmp]++;
x/=prime[i];
}
tmp++;
}
}
if(x>) ind[tmp++]=;
if(fu){
int ret=ind[];
while(ret%==) ret/=;
if(ret==) return ;
for(int i=;i<tmp;i++){
while(ind[i]%==) ind[i]/=;
ret=gcd(ret,ind[i]);
if(ret==) return ;
}
return ret;
}
else{
int ret=ind[];
if(ret==) return ;
for(int i=;i<tmp;i++){
ret=gcd(ret,ind[i]);
if(ret==)return ;
}
return ret;
}
}
int main(){
init();
ll x;
int T;
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%lld",&x);
printf("Case %d: %d\n",t,solve(x));
}
return ;
}
最新文章
- 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等
- asp.net中如何防止用户重复点击提交按钮
- php基础复习(一)smarty模板
- Ubuntu Server 14.04 下root无法ssh登陆
- Codeforces 494D Upgrading Array
- OC学习那些事:点语法
- HDU 1828 POJ 1177 Picture
- 在当前图纸中创建一个表格, AcDbTable 类
- SpringBoot处理日期转换问题
- 平衡二叉树(Balanced Binary Tree&#160;或&#160;Height-Balanced Tree)又称AVL树
- K进制数
- 临时关闭Mysql ONLY_FULL_GROUP_BY
- MES模块
- 环回接口---loopback
- pip使用简要说明
- MVC与WebApi中的异常统一处理
- 详解Base64编码和解码
- WCF可靠性会话之服务分流
- Fiddler2 模拟文件上传
- RAC常用日志总结