【第22期】观点:IT 行业加班,到底有没有价值?

模pow(x,t)下多项式求逆

原创 2015年07月08日 19:17:32

题意:A(x) is known, A(x)*B(x)=1( mod pow(x,t) ),calculate B(x) ?
解法:先求t=[t/2]时的解为B0(x),然后经过数学处理可得到B(x)和B0(x)的关系。
详见博客http://picks.logdown.com/posts/189620-inverse-element-of-polynomial

const int mo = 1e9+7;
const int maxn = 100000+10;
int qpow(int a,int b,int mo){
    int ans=1;
    while(b){
        if(b&1) { ans=(ans*a)%mo; b--; }
        b>>=1,a=(a*a)%mo;
    }
    return ans;
}

//A(x) is known, A(x)*B(x)=1( mod pow(x,t) ),calculate B(x) ?
int tmp[maxn];
void getinv(int A[],int B[],int t){
    if(t==1){ B[0]=qpow(B[0],mo-2,mo); return; }
    getinv(A,B,(t+1)>>1);
    int k=1; for(;k<=(t+1)<<1;k<<=1);  int inv_k=qpow(k,mo-2,mo);
    for(int i=0;i<t;i++) tmp[i]=A[i]; for(int i=t;i<k;i++) tmp[i]=0;
    fft(tmp,k,0),fft(B,k,0);
    for(int i=0;i<k;i++) { tmp[i]=(2-(ll)tmp[i]*B[i]%mo+mo)%mo; }
    for(int i=0;i<k;i++) { B[i]=(ll)B[i]*tmp[i]%mo; }
    fft(B,k,1);
    for(int i=0;i<t;i++) { B[i]=(ll)B[i]*inv_k%mo; } for(int i=t;i<k;i++) B[i]=0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

n阶多项式拟合与n阶矩阵求逆的C语言实现

http://home.eeworld.com.cn/my/space-uid-189420-blogid-84475.html /*****************************...

Pow(x, n) 求一个数的n次方

我们知道C++中是有pow函数的,我们这次自己来写个,因为有这样的算法题目。 所需数学知识: 大致考虑正数,0,负数即可。n多个数相乘的问题。<

组合数求模

在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题。last update time : 2017-03-30

Pow(x, n)

Implement pow(x, <em style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height:

Pow(x, n)

Implement pow(x, n). x is double type and n is a integer type. 这是一道设计题,实现pow方法。主要考察对细节的处理,比如当n为负数时我们应该如何处理,仅仅是将n变为正数取倒数吗,如果当n为MIN_VALUE就会溢出,这种情况我们就要单独处理。此外我们通过右移来提高运算速度,每右移一次,x都加倍。实现代码如下: [code="java"] public class Solution { public double myPow(double x, int n) { if(n == 0) retur
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)