题目链接:传送门

题目:

B. Math
time limit per test
second
memory limit per test
megabytes
input
standard input
output
standard output JATC's math teacher always gives the class some interesting math problems so that they don't get bored. Today the problem is as follows. Given an integer n , you can perform the following operations zero or more times: mul x : multiplies n by x (where x
is an arbitrary positive integer).
sqrt: replaces n
with n−−√ (to apply this operation, n−−√ must be an integer). You can perform these operations as many times as you like. What is the minimum value of n , that can be achieved and what is the minimum number of operations, to achieve that minimum value? Apparently, no one in the class knows the answer to this problem, maybe you can help them?
Input The only line of the input contains a single integer n
(≤n≤ ) — the initial number.
Output Print two integers: the minimum integer n that can be achieved using the described operations and the minimum number of operations required.
Examples
Input
Copy Output
Copy Input
Copy Output
Copy Note In the first example, you can apply the operation mul
to get and then sqrt to get . In the second example, you can first apply sqrt to get
, then mul to get and finally two more sqrt and you get . Note, that even if the initial value of n
is less or equal , it can still become greater than after applying one or more operations.

题目大意:

  输入一个数n,对这个数可以进行两种操作:

  (1)乘上一个任意大小的整数;

  (2)取平方根。(这里要求取平方根前必须为完全平方数

  问使得输入的n经过任意次操作变成最小值时,输出这个最小值和变成最小值所需要的最少的操作数。

  1 ≤ n ≤ 106

思路:

  ①:n的最小值为它所有质因子的乘积;(如果有一个质因子的指数大于1,那么就不是最小的,而且通过操作②③变成最小的)

  ②:操作(1)最多只需要执行一次,用这次操作把n所有质因子的指数都变成相同的,并且这个指数的值为2的幂次(取平方根时幂次会/=2);

  ③:操作(2)的次数就是②步骤结束后,log2(质因子的指数)。

然后把②和③的次数合起来就好了。

实现:

  试除法筛出n所有的质因子pi及其指数ci,则第一个答案a = $\prod_{i=1}^{fatCnt}p_{i}$。(fatCnt为质因子的数量)

  令b = max(ci),令2t为最小的不小于b的2的幂次。

  ①:如果t为0,那么答案为0;(n不可能变得更小了)

  ②:只要有一个ci < 2t,答案就为t+1;(必须要执行一次操作(1),才能不断的开方)

  ③:如果所有的ci = 2t,答案为t。(此时不执行操作(1),就可以不断开方直到最小)

代码:

  (马上去补!)

比赛代码:

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = ;
int prime[MAX_N+];
void getPrime()
{
memset(prime, , sizeof prime);
for (int i = ; i <= MAX_N; i++) {
if (!prime[i]) prime[++prime[]] = i;
for (int j = ; j <= prime[] && prime[j] <= MAX_N/i; j++) {
prime[prime[j]*i] = ;
if (i%prime[j] == ) break;
}
}
} int factor[][];
int fatCnt;
int getFactors(int x)
{
fatCnt = ;
int tmp = x;
for (int i = ; prime[i] <= tmp/prime[i]; i++) {
if (tmp % prime[i] == ) {
factor[fatCnt][] = prime[i];
factor[fatCnt][] = ;
while (tmp % prime[i] == ) {
factor[fatCnt][]++;
tmp /= prime[i];
}
fatCnt++;
}
}
if (tmp > ) {
factor[fatCnt][] = tmp;
factor[fatCnt][] = ;
fatCnt++;
}
return fatCnt;
} int getbin(int x)
{
int tmp = ;
while (tmp < x) {
tmp <<= ;
}
return tmp;
} bool check(int ansb)
{//ÊÇ·ñÓв»Í¬
int cnt = factor[][];
if (cnt != (<<ansb))
return true;
for (int i = ; i < fatCnt; i++) {
if (factor[i][] != cnt)
return true;
}
return false;
} //int bin[21];
int main() {
// bin[0] = 1;
// for (int i = 1; i < 21; i++) bin[i] = bin[i-1] << 1;
getPrime();
int N;
cin >> N;
getFactors((int)N);
int a = , b = ;
for (int i = ; i < fatCnt; i++) {
a *= factor[i][];
b = max(b, getbin(factor[i][]));
}
int ansb = ;
while (b > ) {
ansb++;
b >>= ;
}
if (ansb > && check(ansb)) {
ansb++;
}
cout << a << ' ' << ansb << endl;
return ;
}

Codeforces1062B. Math(合数分解)的更多相关文章

  1. HDU 4610 Cards (合数分解,枚举)

    Cards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. HDU 4497 GCD and LCM (合数分解)

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  3. hdu_4497GCD and LCM(合数分解)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 GCD and LCM Time Limit: 2000/1000 MS (Java/Other ...

  4. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  5. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. Perfect Pth Powers pku-1730(筛+合数分解)

    题意:x可以表示为bp, 求这个p的最大值,比如 25=52, 64=26,  然后输入x 输出 p 就是一个质因子分解.算法.(表示数据上卡了2个小时.) 合数质因子分解模板. ]; ]; ; ;n ...

  7. pku1365 Prime Land (数论,合数分解模板)

    题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...

  8. 莫比乌斯函数 51nod-1240(合数分解试除法)

    就是输出n时,莫比乌斯函数的值.直接将n唯一分解即可. 思路:筛出105以内的素数,因为109开方,105就差不多.当一个大数还没有被1000个素数分解,那么这个数基本上可以认为是素数(为合数为小概率 ...

  9. csu 1801(合数分解+排列组合)

    1801: Mr. S’s Romance Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15  Solved: 5[Submit][Status][W ...

随机推荐

  1. POI使用记录

    POI CellType类型 CellType  类型  值 CELL_TYPE_NUMERIC  数值型  0 CELL_TYPE_STRING  字符串型 1 CELL_TYPE_FORMULA ...

  2. C# 线程 正确使用Thread.Join()停止方式

    /// <summary>        /// 停下线程        /// </summary>        private void MyStopTask()     ...

  3. TensorFlow和Keras完成JAFFE人脸表情识别

    cut_save_face.py #!/usr/bin/python # coding:utf8 import cv2 import os import numpy as np import csv ...

  4. Navicat Premium 12激活

    大自然的搬运工:https://www.jianshu.com/p/5f693b4c9468 声明:本文所提供的所有软件均来自于互联网,个人存放在此作为备用,以备将来不时之需,同时作为大家的分享和学习 ...

  5. CSS基础学习(一) 之 line-height 与 height 属性区别

    官方定义: height:定义了了元素的高度.默认情况下,该属性订了 content area(内容区域) 的高度.如果box-sizing属性设置为 border-box,那么height就表示bo ...

  6. IP分为五类

    IP地址分为五类: IP地址分为五类:A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验. 常用的三类IP地址 IP = 网路地址(网络号)+主机地址(主 ...

  7. js实现往数组中添加非存在的对象,如果存在就改变键值。

    let arr = [] // 数组中元素数据类型为{name: 'bb', age: 12} // 现在需求是,将每次获得的新对象{name: '', age: }push到数组arr中,但前提是数 ...

  8. H5高德地图获取当前位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. mysql,Jdbc工具类,只需一条sql实现简单查询

    import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...

  10. Cassandra.yaml 配置详解

    cluster_name 设置Cassandra集群的名称. 在Cassandra集群中,每一台服务器都必须具备相应的集群的名称.如果名称不一致,则当前Cassandra服务器无法加入集群. init ...