zoukankan      html  css  js  c++  java
  • 算法注意---4、解决算法bug的一条思路(除了日志,二分法查bug)

    算法注意---4、解决算法bug的一条思路(除了日志,二分法查bug)

    一、总结

    一句话总结:

    遇到代码bug,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列

    1、memset(f,-1, sizeof(f));?

    memset的sizeof在最后,要设置的值在中间

    2、memset的头文件?

    string.h,因为本来就是初始化string的值的,对应在c++中就是cstring

    3、矩阵乘法?

    矩阵乘法的ijk就是我们正常模拟矩阵的乘的顺序
    1 2 3   
    4 5 6 
    
    1 2
    3 4 
    5 6
    
    for(int i=0; i!=ans.h_size(); ++i) A的每一行一行的来     
    for(int j=0; j!=ans.l_size(); ++j) A的每一行都要和B的每一列乘     
    for(int k=0; k!=m.l_size(); ++k) A的一行的每一个数都要和B的一列的每一个数相乘
    ans[i][j]+=m[i][k]*n[k][j];

    4、c++函数的参数传递二维数组?

    int multiply(int a[3][3],int b[3][3]){}
    int multiply(int a[3][3],int b[3][3]){
        int ans[3][3]={0};
        for (int i = 1; i <= 2; ++i)
            for (int j = 1; j <= 2; ++j)
                for (int k = 1; k <= 2; ++k)
                    ans[i][j]+=(a[i][k] * b[k][j]) % mod;
    }
    multiply(base,base);

    5、c++函数返回二维数组?

    1、算法题中c++函数返回二维数组,这样的需求很小,一般都是创建一个结构体,然后返回结构体
    2、像java、js等我们就可以直接返回一个二维数组
    struct matrix{
        ll s[2][2];
        int n,m;
        void clear(){
            s[0][0]=1;s[0][1]=1;s[1][0]=1;s[1][1]=0;
            n=2;m=2;
        }
    };
    matrix mix(matrix A,matrix B){
        matrix re;
        re.n=A.n;re.m=B.m;
        for(int i=0;i<re.n;i++){
           for(int j=0;j<re.m;j++){
               re.s[i][j]=0;
              for(int k=0;k<A.m;k++){
                   re.s[i][j]=(re.s[i][j]+(A.s[i][k]*B.s[k][j])%mod)%mod;
                 }
           } 
        }
        return re; 
    }

    6、快速幂?

    a^11=a^(2^0+2^1+2^3),我们将a¹¹转化为算 a2^0*a2^1*a2^3,原来算11次,现在算三次
    a^11=a^(2^0+2^1+2^3),11的二进制是1011,
    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0*a2^1*a2^3,也就是a1*a2*a8,看出来快的多了吧原来算11次,现在算三次
    
    int poww(int a, int b) {
        int ans = 1, base = a;
        while (b != 0) {
            if (b & 1 != 0){
                ans *= base;
            }
            base *= base;
            b >>= 1;
        }
        return ans;
    }

    7、取模是无论加还是乘都要取模?

    ans.a[i][j]+=(a.a[i][k] * b.a[k][j]) % mod;
    ans.a[i][j]%=mod;

    8、c++从文件中读取和输出到文件?

    freopen("9in.txt","r",stdin);
    freopen("9out.txt","w",stdout);

    9、当n(2^63)比较大,超出int的时候,特别要注意的点是什么(比如斐波那契数列的矩阵快速幂解法)?

    读入以及任何存储的位置(比如函数的参数传递、比如矩阵元素存储)都不能用int,用long long
    注意点:
    1、
    读入n的时候不能用int,因为1<=n<2^63
    
    2、
    注意结构体中的数组要用 long long类型,因为涉及到矩阵的乘法,
    涉及到两个数相乘,所以int mod 1000000007之后,两个数相乘,还是会超int
    
    3、
    因为读入的n是long long类型,所以函数传递参数的时候,也要记得别用成int了
    
    
    //矩阵的快速幂
    Matrix pow(Matrix a,long long n){
        Matrix ans,base=a;
        ans.row=2;ans.column=2;
        ans.v[1][1]=ans.v[2][2]=1;
        while(n){
            if(n%2==1) ans=multiply(ans,base);
            base=multiply(base,base);
            n/=2;
        }
        return ans;
    }

    10、解决算法bug的一条思路(除了日志,二分法查bug)?

    遇到代码bug,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列

    二、内容在总结中

    博客对应课程的视频位置:

     
  • 相关阅读:
    BZOJ2527[Poi2011]Meteors——整体二分+树状数组
    [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
    BZOJ4817[Sdoi2017]树点涂色——LCT+线段树
    BZOJ4269再见Xor——高斯消元解线性基
    BZOJ4241历史研究——回滚莫队
    [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
    [十二省联考2019]异或粽子——可持久化trie树+堆
    [CF594E]Cutting the Line
    [CF1246F]Cursor Distance
    [CF1246E]To Make 1
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13114237.html
Copyright © 2011-2022 走看看