【题解】AcWing 193. 算乘方的牛
题目描述
约翰的奶牛希望能够非常快速地计算一个数字的整数幂P(1 <= P <= 20,000)是多少,这需要你的帮助。
在它们计算得到最终结果的过程中只能保留两个工作变量用于中间结果。
第一个工作变量初始化为x,第二个工作变量初始化为1。
奶牛可以将任意一对工作变量相乘或相除(可以是一个工作变量与自己相乘或相除),并将结果储存在任意一个工作变量中,但是所有结果都只能储存为整数。
举个例子,如果它们想要得到x的31次方,则得到这一结果的一种执行方法如下所示:
工作变量1 工作变量2
开始 : x 1
工作变量1与本身相乘,结果置于工作变量2: x x^2
工作变量2与本身相乘,结果置于工作变量2: x x^4
工作变量2与本身相乘,结果置于工作变量2: x x^8
工作变量2与本身相乘,结果置于工作变量2: x x^16
工作变量2与本身相乘,结果置于工作变量2: x x^32
工作变量2除以工作变量1,结果置于工作变量2: x x^31
因此,x的31次方经过六个操作就可得到。
现在给出你希望求得的具体次幂数,请你计算至少需要多少个操作才能得到。
输入格式
输入包含一个整数P,表示具体次幂数。
输出格式
输出包含一个整数,表示所需最少操作数。
数据范围
1≤P≤20000
样例
输入样例:
31
输出样例:
6
算法1 迭代加深IDA*
剪枝:
1.首先容易考虑到:负数和零是不够优秀的。减去负数等效于加上正数,加上负数等效于减去正数,这样可以避免讨论多余的状态;而除了初始状态外,出现零是没有用的:因为这样相当于只有一个数可供操作。这样一定不会比这个非零的数与另一个非零的数合起来更优。
因此,除法操作时,总是用次数的多的除以次数少的,不使用自己除以自己的操作。乘法操作后,不保留0。
2.在当前深度限制下,如果剩下的步骤全部都把较大的数扩大为两倍还是比目标状态小,显然剪枝。
3.对于当前存储器中次数(a,b),设gcd(a,b)=d,那么不管之后怎么操作,得到的次数一定会是d的倍数。因此,如果不满足d|P,那么剪掉。
参考文献
https://blog.csdn.net/rgnoH/article/details/78469464
C++ 代码
#include <cstdio>
#include <iostream>
using namespace std;
int p,depth=0;
int gcd( int a,int b )
{
if ( !b ) return a;
return gcd( b,a%b );
}
bool IDAstar( int sum,int x,int y )
{
if ( sum==depth )
{
if ( x==p ) return 1;
else return 0;
}
if ( x<<(depth-sum)<p ) return 0;
if ( p%(gcd(x,y))!=0 ) return 0;
int a,b;
a=x+y; b=y;
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=x+y; b=x;
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=x+x; b=y;
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=x+x; b=x;
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=y+y; b=x; if ( a<b ) swap( a,b );
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=y+y; b=y;
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=x-y; b=x; if ( a<b ) swap( a,b );
if ( b && IDAstar( sum+1,a,b ) ) return 1;
a=x-y; b=y; if ( a<b ) swap( a,b );
if ( b && IDAstar( sum+1,a,b ) ) return 1;
return 0;
}
int main()
{
scanf( "%d",&p );
while ( !IDAstar( 0,1,0 ) ) depth++;
printf( "%d",depth );
}
【题解】AcWing 193. 算乘方的牛的更多相关文章
- [题解]Magic Line-计算几何(2019牛客多校第三场H题)
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...
- AcWing 244. 谜一样的牛 (树状数组+二分)打卡
题目:https://www.acwing.com/problem/content/245/ 题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛 ...
- AcWing 244. 谜一样的牛|树状数组
传送门 题目描述 有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整 ...
- 题解【[HAOI2006]受欢迎的牛】
切水题,写题解~ tarjan缩一波点,然后 只有一个出度为0的点:他的size就是答案 有多个初度为0的点:无解,0个 因为是强联通分量,所以肯定有出度为0的点,否则--就是你tarjan写挂了~ ...
- AcWing 244. 谜一样的牛
有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有a头牛比它低,求每头奶牛的身高. #include<bits/stdc+ ...
- [AcWing 777] 字符串乘方
点击查看代码 #include<iostream> using namespace std; string str; int main() { while (cin >> st ...
- 线性基算贡献——19牛客多校第一场H
/* 给定数组a[],求有多少集合的异或值为0,将这些集合的大小之和求出来 对于每个数来说,如果除去这个数后数组里做出的线性基和这个数线性相关,那么这个数贡献就是2^(n-1-线性基的大小) 反之这个 ...
- AcWing 125. 耍杂技的牛
//按照wi+si从小到大的顺序排,结果一定最优,最大的危险系数一定是最小的 //类比于国王游戏 #include <iostream> #include <algorithm> ...
- 题解【[BJOI2012]算不出的等式】
题目背景emmm \[\text{首先特判掉p=q时的情况(ans = }p^2-1\text{)}\] \[\text{构造函数}f(k) = \left\lfloor \frac{kq}{p}\r ...
随机推荐
- IP 层收发报文简要剖析6--ip_forward 报文转发
//在函数ip_route_input_slow->ip_mkroute_input注册, /* * IP数据包的转发是由ip_forward()处理,该函数在ip_rcv_finish() * ...
- FreeSql接入CAP的实践
CAP CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级.易使用.高性能等特点. https://git ...
- SpringIOC基础知识总结
目录 1.BeanFactory和ApplicationContext的区别: 2.实例化bean的三种方式: ⽅式⼀:使⽤⽆参构造函数 ⽅式⼆:使⽤静态⽅法创建 ⽅式三:使⽤实例化⽅法创建 3.Be ...
- tomcat安装证书https
操作步骤(阿里云官网) 解压已下载保存到本地的Tomcat证书文件. 解压后您将看到文件夹中有2个文件,您可为两个证书文件重命名. 证书文件(domain name.pfx):以.pfx为后缀或文件类 ...
- 博客新域名www.tecchen.tech
新年祝福 祝新的一年,大朋友实现所有梦想,小朋友健康成长- 新域名 https://www.tecchen.tech 有效期:10年 旧链接 之前的链接请自行替换为新链接地址,包括但不限于以下二级域名 ...
- ABBYY FineReader添加盖章戳记
PDF编辑器允许您如同在纸质文档上盖章一样在 PDF 文档上添加戳记.您可以从可用的戳记列表中选择戳记或者创建自己的戳记,然后添加任何所需的文本.戳记日期和时间或者图像. 如果要在页面上加上戳记,可以 ...
- 攻克solo第六课(大调音阶与真的爱你)
在本期文章中,笔者将通过guitar pro7和大家分享大调音阶的知识. 不知道大家有没有试着使用my song book里面的谱子,反正笔者是觉得赚大了,并且找了囊括民谣.爵士到摇滚在内不同风格的谱 ...
- 思维导图软件MindManager的视图介绍
MindManager思维导图软件提供了多种视图帮助用户更好边界组织思维导图,包括导图视图.大纲视图.甘特图.链接的视图等等,下面将逐一介绍MindManager视图模式及其作用. 打开软件视图功能区 ...
- 【树形dp】【CF161D】distance on a tree + 【P1352】没有上司的舞会
T1题面: 输入点数为N一棵树 求树上长度恰好为K的路径个数 (n < 1e5, k < 500) 这是今天的考试题,也是一道假的紫题,因为我一个根本不会dp的蒟蒻只知道状态就一遍A掉了- ...
- 第一次个人编程作业:我的分数我做主 - 软件工程与 UML
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...