NKOI 3464 快速乘积

来源:互联网 发布:大数据时代 企业管理 编辑:程序博客网 时间:2024/05/19 02:27

快速乘积

Time Limit:10000MS  Memory Limit:65536K
Total Submit:32 Accepted:18
Case Time Limit:1000MS

Description

给你一个正整数n(1<=n<=1000),问最少需要几次乘法和除法计算就能从x得到xn?
例如得到x31需要六次计算:
1.x2=x*x
2.x4=x2*x2
3.x8=x4*x4
4.x16=x8*x8
5.x32=x16*x16
6.x31=x32/x


当然,也可以是x^2 = x × x, x^3 = x^2 × x, x^4 = x^2 × x^2, x^7 = x^4 × x^3, x^11 = x^4 × x^7, x^22 = x^11 × x^11, x^33 = x^11 × x^22, x^31 = x^33 / x^2. 但这种计算的次数不是最少的。

注意:计算过程中指数不能是负数

Input

输入一个正整数n

Output

输出一个整数,表示最少需要计算的次数

Sample Input

样例1:31样例2:70

Sample Output

样例1:6样例2:8


#include<cstdio>#include<iostream>using namespace std;int n,depth,pow[5000];bool dfs(int k,int cur){if(cur*(1<<(depth-k))<n)return 0;//如果后面都用最大的情况计算仍然到不了n就不再计算if(k==depth)return cur==n;for(int i=0;i<=k;i++){pow[k+1]=pow[i]+pow[k];if(dfs(k+1,pow[k+1]))return 1;pow[k+1]= pow[k]>=pow[i]?pow[k]-pow[i]:pow[i]-pow[k];if(dfs(k+1,pow[k+1]))return 1;} return 0;}int main(){cin>>n;pow[0]=1;while(true){if(dfs(0,1))break;depth++;}cout<<depth;}


0 0
原创粉丝点击