zoukankan      html  css  js  c++  java
  • 二进制除法

    题目描述: 
    二进制数n mod m的结果是多少?

    对于二进制数的取模运算,我们的第一反应一定是模拟其减法运算,然后逐位相减。但是这道题的数据达到了$2e5$,鉴于减法模拟的巨大常数,一定是会$T$的.所以说我们换一个角度考虑这个问题——数论。看到取模我就想起来那个当年那个坑了我两个小时的取模分配率,然后我又注意到题目里那个比较小的数字,m的长度最大为$20$,我可以先把m处理为10进制作为整个题的$moder$,然后用这个$moder$,一边用快速幂将n转为$10$进制一边取模,时间复杂度$O(m+n)$。

    #include<bits/stdc++.h>
    using namespace std;
    long long suma, sumb, x, y;
    int lena, lenb;
    char a[200100], b[100];
    int f[200100];
    int main()
    {
        scanf("%s", a);
        scanf("%s", b);
        lena = strlen(a);
        lenb = strlen(b);
        x = 1;
        for (int i  = lenb - 1; i >= 0; i --){
            if (b[i] == '1')
                sumb += x;
            x = x * 2;
        }
        y = 1;
        for (int i = lena - 1; i >= 0; i --){
            if (a[i] == '1')
                suma = (suma + y);
            suma %= sumb;
            y = (y * 2);
            y %= sumb;
        }
        while (true){
            f[0] ++;
            f[f[0]] = suma % 2;
            suma /= 2;
            if (suma == 0)
                break;
        }
        if (!f[0]){
            printf("0
    ");
            return 0;
        }
        for (int i = f[0]; i >= 1; i --)
            printf("%d", f[i]);
        return 0;
    }
  • 相关阅读:
    Codeforces Round #579 (Div. 3)
    2019牛客暑期多校训练营(第一场)ABBA
    Comet OJ
    Codeforces Round #562 (Div. 2)
    Codeforces Round #569 (Div. 2)
    寒假集训总结
    线段树做题总结
    Git学习
    unity开发vuforia血的教训
    (学习13)最短圆排列问题
  • 原文地址:https://www.cnblogs.com/wjnclln/p/9559834.html
Copyright © 2011-2022 走看看