Power Calculus 快速幂计算 (IDA*/打表)
原题:1374 - Power Calculus
题意:
求最少用几次乘法或除法,可以从x得到x^n。(每次只能从已经得到的数字里选择两个进行操作)
举例:
x^31可以通过最少6次操作得到(5次乘,1次除)
x^2 = x*x
x^4 = (x^2)*(x^2)
x^8 = (x^4)*(x^4)
x^16 = (x^8)*(x^8)
x^32 = (x^16)*(x^16)
x^31 = (x^32)÷x
分析:
可以看到,每次从已得到的数字中选取两个操作,这样就有了枚举的思路。
这道题又是没有明显的枚举次数上限,所以很自然想到了用迭代加深搜索算法。
因为n的数据范围是1~1000,所以可以通过计算,预设最大的枚举层次数上限MAXD是13.
而且可以发现如果当前的数字num*2^(MAXD-d) < n,就没有继续搜的必要了,回溯(num是通过前d步得到的数字)
所以我们的IDA*算法思路基本上就完全了。
进一步优化:
如果只依靠上述的思路,写出来的程序要跑2.7s(上限是3s),所以属于刚刚好AC.
我们这里有很多种优化方法,我就说两个我用了的。
1. 寻找幂的时候,我们每次不应该从已得到数字里任意抽两个,这样效率很低。而且很容易出一道,我们每一次都是操作上一步得到的数字,所以这样只需要枚举另一个操作数就够了。
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXD = ;
int n, f[<<(MAXD - )], maxd, a[]; bool dfs(int d) {
if (a[d] == n) return true;
if (d < maxd && (a[d]<<(maxd - d)) >= n) {
for (int i = d; i >= ; i--)
for (int j = ; j < ; j++) {
int nextn = j ? a[d] + a[i] : a[d] - a[d - i];
if (nextn <= || f[nextn]) continue;
f[nextn] = ;
if (nextn <= ) continue;
a[d + ] = nextn;
if (dfs(d + )) return true;
f[nextn] = ;
}
}
return false;
}
int main() {
a[] = ;
while (scanf("%d", &n) == && n) {
if (n == ) { printf("0\n"); continue;}
for (maxd = ; maxd < MAXD; maxd++) {
memset(f, , sizeof(f));
f[] = ;
if (dfs()) break;
}
printf("%d\n", maxd);
}
return ;
}
2.打表。
因为n的范围是1~1000, 所以我们可以用稍微慢一点的算法,提前算出来结果,保存到文件里,然后再粘贴到提交的代码里。
比如我的代码是
int main() {
freopen("ans_table", "w", stdout);
/*
some code.
*/
for(n = ; n <= ; n++) {
if (n == ) { printf("ans[%d] = 0;\n", i); continue;}
for (maxd = ; maxd < MAXD; maxd++) {
/*
some code.
*/
if (dfs(, )) break;
}
printf("ans[%d] = %d;\n", i, maxd);
}
return ;
}
这样我们就本地生成了文件"ans_table"。
里面的答案都是形如
ans[1] = 0;
ans[2] = 1;
ans[3] = 2;
ans[4] = 2;
ans[5] = 3;
ans[6] = 3;
ans[7] = 4;
ans[8] = 3;
ans[9] = 4;
ans[10] = 4;
ans[11] = 5;
ans[12] = 4;
相当于直接生成代码形式的表格。
速度自然是0ms
Power Calculus 快速幂计算 (IDA*/打表)的更多相关文章
- 7-13 Power Calculus 快速幂计算 uva1374
想到快速幂 但是这题用不上 用迭代加深搜索 注意启发函数为 当前最大数<<(maxx-d) 如果大于n则剪枝 注意跳出语句的两种写法 一种170ms 一种390ms !!! d ...
- 矩阵快速幂计算hdu1575
矩阵快速幂计算和整数快速幂计算相同.在计算A^7时,7的二进制为111,从而A^7=A^(1+2+4)=A*A^2*A^4.而A^2可以由A*A得到,A^4可以由A^2*A^2得到.计算两个n阶方阵的 ...
- POJ 3233 Matrix Power Series——快速幂&&等比&&分治
题目 给定一个 $n \times n$ 的矩阵 $A$ 和正整数 $k$ 和 $m$.求矩阵 $A$ 的幂的和. $$S = A + A^2 + ... + A^k$$ 输出 $S$ 的各个元素对 ...
- UVa 1374 快速幂计算(dfs+IDA*)
https://vjudge.net/problem/UVA-1374 题意:给出n,计算最少需要几次能让x成为x^n(x和已经生成的数相乘或相除). 思路:IDA*算法. 如果当前数组中最大的数乘以 ...
- uva 1374 快速幂计算
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...
- UVa 1374 - Power Calculus——[迭代加深搜索、快速幂]
解题思路: 这是一道以快速幂计算为原理的题,实际上也属于求最短路径的题目类型.那么我们可以以当前求出的幂的集合为状态,采用IDA*方法即可求解.问题的关键在于如何剪枝效率更高.笔者采用的剪枝方法是: ...
- POJ 3233 Matrix Power Series (矩阵快速幂+二分求解)
题意:求S=(A+A^2+A^3+...+A^k)%m的和 方法一:二分求解S=A+A^2+...+A^k若k为奇数:S=(A+A^2+...+A^(k/2))+A^(k/2)*(A+A^2+...+ ...
- UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)
题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))( ...
- ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...
随机推荐
- Sql2008中使用DataTable作为存储过程的参数
使用DataTable作为存储过程的参数 最近工作中写了几个存储过 程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于 split 的函数,只好自己处理,将前台数据 ...
- 实现多个ContentProvider对多张表进行操作
http://blog.csdn.net/maylian7700/article/details/7365373 SQLite数据库直接操作类: DatabaseHelper.java package ...
- A除以B_2
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...
- MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
在安装MySQL 5.6.30时,安装完成后,后台日志报如下警告信息:2016-05-27 12:25:27 7fabf86f7700 InnoDB: Error: Table "mysql ...
- Spring 创建bean的模式
在默认情况下,spring创建bean是单例模式 scope="singleton ",还有一种方式为多例模式[prototype] scope sing ...
- 【vc】14_网络编程_socket编程
1.计算机网络基本知识 最简单的网络程序如图: 提示:IP地址就相当于一个公司的总机号码,端口号就相当于分机号码.在打电话时,拨通总机后,还需要转到分机上. (1)协议 ·为进行网络中的数据交换(通信 ...
- 【POJ2761】【fhq treap】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- vim技巧和坑
VIM的匹配替换功能很快很强大,但是要显示匹配个数就很苦情,要绕个弯子实现:%s/xxx//gn关键是最后的n,代表只报告匹配的个数,而不进行实际的替换. vim v5 强大.. 另外,如果你习惯了w ...
- windows7 64 位 mysql 5.6.12 安装
1.修改 my-default.ini 改名为 my.ini 内容修改为 [mysqld] loose-default-character-set = utf8 basedir = D:/mys ...
- asp.net在应用母版的页面下采用了ModalPopupExtender弹出窗中应用autocomplete
autocomplete是jqueryUI的一个插件,可以实现自动填充的功能. 要点:1.应用了母版页,所以取页面上控件的ID时与一般方法不同 2.由于用了ajax的updatepanel,所以会出现 ...