二進制除法


題目描述: 
二進制數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\n");
        return 0;
    }
    for (int i = f[0]; i >= 1; i --)
        printf("%d", f[i]);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM