一,两种不同的求幂运算

求解x^n(x 的 n 次方)

①使用递归,代码如下:

     private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}

分析:

每次递归,使得问题的规模减半。2到6行操作的复杂度为O(1),第7行pow函数里面的x*x操作复杂度为O(1)

故时间复杂度公式:T(N)=T(N/2)+O(1)   =>   T(N)=O(logN)

②普通方式求幂

     private static long pow2(int x, int n){
if(x == 0)
return 0;//0^n == 0
long p = 1;
for(int i = 0; i < n; i++)
p *= x;
return p;
}

显然,时间复杂度为O(N)

二,求解多项式乘法

公式:f(x,n) = a(0)x^0 + a(1)x^1 + a(2)x^2+...+a(n)x^n

比如:f(10,4)=a(0)10^0 + a(1)10^1 + a(2)10^2 + a(3)10^3+a(4)10^4

代码如下:

     public static long poly(int[] arr, int x, int n){
long sum = 0;
for(int i = 0; i <= n; i++){
sum += arr[i] * pow(x, i);
}
return sum;
} private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}

Horner法则求解多项式乘法,参考:

     public static long poly2(int[] arr, int x, int n){//arr存储系数, x 表示基数, n 表示幂
long poly = 0;
for(int i = n; i >= 0; i--)
poly = poly * x + arr[i];
return poly;
}

对比采用Horner法则计算多项式乘法与这篇文章: 字符串转换成数字

 public int atoi(char[] s){
int result = 0;
for(int i = 0; i < s.length; i++)
result = result * 10 + s[i] - '0';// 相当于 poly2(...)中的 x=10
return result;
}

可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是Horner法则。

由此,得到启发,在进制转换中,如:八进制转十进制,相当于 x = 8。

故可写出一个常用的进制转换程序,如下:

    //x 表示进制, 若x=8,表示将8进制转换成10进制
public static long convert(char[] arr, int x){
long result = 0;
for(int i = 0; i < arr.length; i++)
result = result * x + arr[i] - '0';
return result;
} //str 表示原来进制的数,如:convert("456", 8) 456 --> 302
public static long convert2(String str, int x){
long result = 0;
for(int i = 0; i < str.length(); i++)
result = result * x + Integer.valueOf(str.charAt(i) - '0');
return result;
}

十六进制转十进制,相当于 x = 16。

    public static long convert2(String str, int x){//x = 16
long result = 0;
char c;
str = str.toUpperCase();//"abF8"-->"ABF8"
for(int i = 0; i < str.length(); i++)
{
c = str.charAt(i);
if(c >= 'A' && c <= 'F')
result = result * x + (c - 'A') + 10;
else
result = result * x + c - '0';
}
return result;
}

因此,进制转换、字符串转换成数字、多项式求值都可以使用Horner法则来求解。

求幂运算、多项式乘法及Horner法则的应用的更多相关文章

  1. FFT求卷积(多项式乘法)

    FFT求卷积(多项式乘法) 卷积 如果有两个无限序列a和b,那么它们卷积的结果是:\(y_n=\sum_{i=-\infty}^\infty a_ib_{n-i}\).如果a和b是有限序列,a最低的项 ...

  2. 小白专场-多项式乘法与加法运算-python语言实现

    目录 题意理解 解题思路 多项式加法 多项式乘法 完整代码 题意理解 题目: 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一 ...

  3. AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

    题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...

  4. [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)

    卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...

  5. 二分求幂/快速幂取模运算——root(N,k)

    二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...

  6. 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂

    牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...

  7. [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树

    题面 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树.对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为\(1\)的结点是叶子结 ...

  8. 求幂&&快速幂&&位运算

    1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i+ ...

  9. 【luogu P3803】【模板】多项式乘法(FFT)

    [模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...

随机推荐

  1. Linux基础学习(6)--Linux软件安装

    第六章——Linux软件安装 一.软件包管理简介 1.软件包分类: (1)源码包:脚本安装包 (2)二进制包(RPM包.系统默认包) 2.源码包: (1)源码包的优点:开源,如果有足够的能力,可以修改 ...

  2. .gitignore & .DS_Store

    .gitignore & .DS_Store https://stackoverflow.com/questions/107701/how-can-i-remove-ds-store-file ...

  3. VMware虚拟机看不到共享目录

    1. 确认VMtools已经装好,开启共享文件夹,设置好共享目录 2.执行命令 sudo mount -t vmhgfs .host:/ /mnt/hgfs如果出现错误: Error: cannot ...

  4. python 模块之-configparser

    python 模块configparser   配置文件模块 import configparser    config = configparser.ConfigParser() config[&q ...

  5. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]……a[j]中第k小的数是多少(1≤k ...

  6. Threed.sleep是不会释放锁,而wait是释放锁的(对象锁)

    实战分析 一直都说,Threed.sleep是不会释放锁,而wait是释放锁的(对象锁),现理论上来分析一下啊. v package thread.concurrent; public class D ...

  7. 自学Python5.2-类和对象概念

    自学Python之路 自学Python5.2-类和对象概念 面向对象编程的2个非常重要的概念:类和对象 对象是面向对象编程的核心: 在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出 ...

  8. linux一次性解压多个.gz或者.tar.gz文件

    对于解压多个.gz文件的,用此命令: for gz in *.gz; do gunzip $gz; done 对于解压多个.tar.gz文件的,用下面命令: for tar in *.tar.gz; ...

  9. 【ARC102E】Stop. Otherwise...(容斥原理,动态规划)

    [ARC102E]Stop. Otherwise...(容斥原理,动态规划) 题面 AtCoder 有\(n\)个骰子,每个骰子有\(K\)个面,上面有\(1\)到\(K\).骰子都是一样的. 现在对 ...

  10. [CF1132F]Clear the String

    题意 给你一个串s,每次可以花费1的代价删去一个子串,要求子串的每一位为同一个字符. 求删去整个串的最小代价. 分析 这是一道非常简单的区间\(DP\)问题,我们定义\(f[i][j]\)表示删去子串 ...