• 等比数列二分求和(logn复杂度)


    看完这个之后,感觉数学简直太厉害了 转载自:http://blog.csdn.net/acdreamers/article/details/7851144

    今天我们学习如何有效地求表达式的值。对于这个问题,用二分解决比较好。

    (1)时,

    (2)时,那么有

        

    (3)时,那么有

        

    代码:

     
    #include <iostream>  
    #include <string.h>  
    #include <stdio.h>  
      
    using namespace std;  
    const int M = 1000000007;  
    typedef long long LL;  
      
    LL power(LL a,LL b)  
    {  
        LL ans = 1;  
        a %= M;  
        while(b)  
        {  
            if(b & 1)  
            {  
                ans = ans * a % M;  
                b--;  
            }  
            b >>= 1;  
            a = a * a % M;  
        }  
        return ans;  
    }  
      
    LL sum(LL a,LL n)  
    {  
        if(n == 1) return a;  
        LL t = sum(a,n/2);  
        if(n & 1)  
        {  
            LL cur = power(a,n/2+1);  
            t = (t + t * cur % M) % M;  
            t = (t + cur) % M;  
        }  
        else  
        {  
            LL cur = power(a,n/2);  
            t = (t + t * cur % M) % M;  
        }  
        return t;  
    }  
      
    int main()  
    {  
        LL a,n;  
        while(cin>>a>>n)  
            cout<<sum(a,n)<<endl;  
        return 0;  
    }  
    

      

    题目:http://poj.org/problem?id=3233

    题意:矩阵求和

    代码:

    #include <iostream>  
    #include <string.h>  
    #include <stdio.h>  
      
    using namespace std;  
    const int N = 35;  
      
    struct Matrix  
    {  
        int m[N][N];  
    };  
      
    Matrix I;  
    int n,k,M;  
      
    Matrix add(Matrix a,Matrix b)  
    {  
        Matrix c;  
        for(int i=0; i<n; i++)  
        {  
            for(int j=0; j<n; j++)  
            {  
                c.m[i][j] = a.m[i][j] + b.m[i][j];  
                c.m[i][j] %= M;  
            }  
        }  
        return c;  
    }  
      
    Matrix multi(Matrix a,Matrix b)  
    {  
        Matrix c;  
        for(int i=0; i<n; i++)  
        {  
            for(int j=0; j<n; j++)  
            {  
                c.m[i][j] = 0;  
                for(int k=0; k<n; k++)  
                    c.m[i][j] += a.m[i][k] * b.m[k][j];  
                c.m[i][j] %= M;  
            }  
        }  
        return c;  
    }  
      
    Matrix power(Matrix A,int n)  
    {  
        Matrix ans = I,p = A;  
        while(n)  
        {  
            if(n & 1)  
            {  
                ans = multi(ans,p);  
                n--;  
            }  
            n >>= 1;  
            p = multi(p,p);  
        }  
        return ans;  
    }  
      
    Matrix sum(Matrix A,int k)  
    {  
        if(k == 1) return A;  
        Matrix t = sum(A,k/2);  
        if(k & 1)  
        {  
            Matrix cur = power(A,k/2+1);  
            t = add(t,multi(t,cur));  
            t = add(t,cur);  
        }  
        else  
        {  
            Matrix cur = power(A,k/2);  
            t = add(t,multi(t,cur));  
        }  
        return t;  
    }  
      
    int main()  
    {  
        while(scanf("%d%d%d",&n,&k,&M)!=EOF)  
        {  
            Matrix A;  
            for(int i=0; i<n; i++)  
            {  
                for(int j=0; j<n; j++)  
                {  
                    scanf("%d",&A.m[i][j]);  
                    A.m[i][j] %= M;  
                    I.m[i][j] = (i==j);  
                }  
            }  
            Matrix ans = sum(A,k);  
            for(int i=0; i<n; i++)  
            {  
                for(int j=0; j<n; j++)  
                    printf("%d ",ans.m[i][j]);  
                puts("");  
            }  
        }  
        return 0;  
    }  
  • 相关阅读:
    SQL Server2005重新安装不上的问题及其解决(转)
    取消2003默认共享
    自写生成实体类工具
    双核886针CPU简明制作教程
    VS 2008 在安装SP1后智能提示变成英文的解决办法
    VS2008 安装盘的问题
    拖放 DataGrid 列摘自MSDN
    VB.net SP1 的兼容性问题
    Windows Server 2008+VS2008
    Combobox 的解决方法
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6649400.html
Copyright © 2020-2023  润新知