SCL(自己的标准代码库)

版权声明:转载留名即可 ^_^ https://blog.csdn.net/qq_33375598/article/details/88741838

1,快速幂运算

1.1方法1

typedef long long LL;
LL binaryPow(LL a, LL b, LL m){
    if(b == 0) return 1;
    if(b % 2 == 1) //可以替换为 if(b&1)
        return  a * binaryPow(a, b - 1, m) % m;
    else{
        LL mu1 = binaryPow(a, b / 2, m);
/*不可直接返回binaryPow(a, b / 2, m)*binaryPow(a, b / 2, m)
因为会调用两次binaryPow函数,导致复杂度变为O(2^log(b)) = O(b)
*/
        return mu1 * mu1 % m;
    }
}

1.2方法2

typedef long long LL;
 
LL binaryPow(LL a, LL b, LL m){
 
    LL ans = 1;
 
    while(b > 0){
 
        if(b & 1){      //如果b的二进制末尾为1
 
            ans = ans * a % m;//令ans累计a
 
        }
 
        a = a * a % m;      //令a开平方
 
        b >>= 1;           //将b的二进制右移一位
 
    }
 
    return ans;
}

2, 日期计算(求两个日期间的差值)

int month[13][2] ={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
                   {31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};

bool isLeap(int year){
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}


int ans = 1;
    while(y1 < y2 || m1 < m2 || d1 < d2){
        d1++;
        if(d1 == month[m1][isLeap(y1)] + 1){
            d1 = 1;
            m1++;
        }
        if(m1 == 13){
            m1 = 1;
            y1++;
        }
        ans++;
    }

猜你喜欢

转载自blog.csdn.net/qq_33375598/article/details/88741838
今日推荐