Codeforces1062B. Math(合数分解)
题目链接:传送门
题目:
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(合数分解)的更多相关文章
- HDU 4610 Cards (合数分解,枚举)
Cards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 4497 GCD and LCM (合数分解)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- hdu_4497GCD and LCM(合数分解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 GCD and LCM Time Limit: 2000/1000 MS (Java/Other ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- hdu 4777 树状数组+合数分解
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Perfect Pth Powers pku-1730(筛+合数分解)
题意:x可以表示为bp, 求这个p的最大值,比如 25=52, 64=26, 然后输入x 输出 p 就是一个质因子分解.算法.(表示数据上卡了2个小时.) 合数质因子分解模板. ]; ]; ; ;n ...
- pku1365 Prime Land (数论,合数分解模板)
题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...
- 莫比乌斯函数 51nod-1240(合数分解试除法)
就是输出n时,莫比乌斯函数的值.直接将n唯一分解即可. 思路:筛出105以内的素数,因为109开方,105就差不多.当一个大数还没有被1000个素数分解,那么这个数基本上可以认为是素数(为合数为小概率 ...
- csu 1801(合数分解+排列组合)
1801: Mr. S’s Romance Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 15 Solved: 5[Submit][Status][W ...
随机推荐
- Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式
题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...
- MySQL基础和JDBC
第一章 命令行工具 mysqladmin:MySQL服务器管理工具 mysql:MySQL客服端链接工具 mysqldump 演示链接到服务器host=127.0.0.1,用户名为root,密码为空 ...
- Pandas之索引
Pandas的标签处理需要分成多种情况来处理,Series和DataFrame根据标签索引数据的操作方法是不同的,单列索引和双列索引的操作方法也是不同的. 单列索引 In [2]: import pa ...
- 2017年天梯赛LV2题目汇总小结
Ⅰ.L2-021 点赞狂魔---STL应用 微博上有个"点赞"功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性 ...
- vue--数据显示模版上
首先需要知道 挂载点:是index.html文件下的一个dom节点 模板:挂载点里的内容,也就是模板内容. 组件: 页面上的某一部分内容.当我们的项目比较大时,可以将页面拆分成几个部分,每个部分就是一 ...
- python 过滤四字节字符 表情字符
项目中有时需要过滤掉四字节以上的字符(表情),比如mysql数据库5.5.3以下的版本text字段不支持四字节以上字符 于是就需要过滤掉再入库,python中的方法为: try: # pyth ...
- 解决依赖冲突:maven-enforcer-plugin插件
我们会经常碰到这样的问题,在pom中引入了一个jar,里面默认依赖了其他的jar包.jar包一多的时候,我们很难确认哪些jar是我们需要的,哪些jar是冲突的.此时会出现很多莫名其妙的问题,什么类找不 ...
- Kotlin 基本数据类型
Kotlin 的基本数值类型包括 Byte.Short.Int.Long.Float.Double 等.不同于Java的是,字符不属于数值类型,是一个独立的数据类型. 类型 位宽度 Double 64 ...
- Lab 7-2
Analyze the malware found in the file Lab07-02.exe. Questions and Short Answers How does this progra ...
- Web版记账本开发记录(五)
今天是第五天,不过今天有点事什么都没做,只是看了看一些教学视频, 今天家里有事, 还没来得及实践,等明天再实践,然后再完善完善.