呵呵,差点AK……今天下午的考试可谓不艰难,考完试之后我越发珍惜生命的美好了。
1.二进制除法
题目描述:
二进制数n mod m的结果是多少?
思路:
对于二进制数的取模运算,我们的第一反应一定是模拟其减法运算,然后逐位相减。但是这道题的数据达到了2e5,鉴于减法模拟的巨大常数,一定是会T的(这个我本人在考试的时候写了一个果然是T了不必感到任何的怀疑)。所以说我们换一个角度考虑这个问题——数论。看到取模我就想起来那个当年那个坑了我两个小时的取模分配率,然后我又注意到题目里那个比较小的数字,m的长度最大为20,仿佛一下就开启了新世界的大门,我可以先把m处理为10进制作为整个题的moder,然后用这个moder,一边用快速幂将n转为10进制一边取模,时间复杂度O(m+n)。
代码:
/*
2016.8.8BulaBulaCHN
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
long long moder;
long long p;
long long tenbit;
char x[200050];
char y[50];
int a1[200050];
int a[200050];
int main()
{
freopen("binary.in","r",stdin);
freopen("binary.out","w",stdout);
scanf("%s%s",x,y);
int leny=strlen(y);
int lenx=strlen(x);
p=1;
for(int i=leny-1;i>=0;i--)
{
if(y[i]=='1') moder+=p;
p=p*2;
}//处理出moder
p=1;
for(int i=lenx-1;i>=0;i--)
{