A*B Problem

原创 2016年08月29日 11:45:18

【题目描述】
给出一个数A,你需要给出一个最小的数B,使得A与B的乘积只含有0和1。
【输入格式】
一个正整数A
【输出格式】
正整数B和A与B的乘积,两数之间用一个空格隔开
【样例输入】
6
【样例输出】
185 1110
【分析】
首先想到的是穷举2进制01串,但这样肯定会超时。
可以根据二进制01串(作为十进制数运算)除以A的余数进行递推,因为如果两个位数相同的01串除以A的余数相同,则在它们的最高位前再加个1后,两个新的01串除以A的余数仍然相同。而题目求的是最小的01串,故只需记录值较小的01串即可。
再利用mod运算的两个性质:
(a*b) mod n=(a mod n)×(b mod n)
10^k mod n=(…(((10 mod n)×10) mod n)×10…) mod 10
高精度运算就可以避免了。

var
  i,n,k,len,r,tmpf,tmpl:longint;
    flag:boolean;
    long,father:array[0..10000]of longint;
begin
  read(n);
    if n=1 then begin write(1,' ',1);halt; end;
    fillchar(father,sizeof(father),0);
    fillchar(long,sizeof(long),0);
    long[1]:=1;
    r:=1;
    len:=1;
    while long[0]=0 do begin
      r:=r*10 mod n;
        inc(len);
        for i:=0 to n-1 do
          if (i=0) or (long[i]>0) and (long[i]<len) then begin
              k:=i+r;
                if k>=n then k:=k-n;
                if long[k]=0 then begin
                  long[k]:=len;
                    father[k]:=i;
                end;
            end;
    end;
    k:=father[0];
    tmpf:=k;
    tmpl:=len;
    father[0]:=-1;
    long[0]:=0;
    r:=0;
    flag:=true;
    while k>=0 do begin
      r:=r*10+1;
        if r div n>0 then begin
          write(r div n);
            flag:=false;
        end;
        if (r div n=0)and(flag=false) then write(0);
        r:=r mod n;
        for i:=len-1 downto long[k]+1 do begin
          r:=r*10;
            if r div n>0 then begin
              write(r div n);
                flag:=false;
            end;
            if (r div n=0)and(flag=false) then write(0);
            r:=r mod n;
        end;
        len:=long[k];
        k:=father[k];
    end;
    write(' ');
    k:=tmpf;
    len:=tmpl;
    father[0]:=-1;
    long[0]:=0;
    while k>=0 do begin
      write(1);
        for i:=len-1 downto long[k]+1 do write(0);
        len:=long[k];
        k:=father[k];
    end;
end.
版权声明:本文原创,可以转载,但需附上原文链接,否则你的生命将会-1s!!!! 举报

相关文章推荐

【poj2152】Fire 树形DP

DescriptionCountry Z has N cities, which are numbered from 1 to N. Cities are connected by highways,...

poj 2152 一道很难的树型DP

题目:poj 2152  Fire          我想说的:以前做背包的题目做多了,脑子形成了一种就是所有动态规划就是在数组上进行等一些固定的思想。结果最近在做一些题目的时候,感觉无从下手,想好...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

POJ2152 树形DP

题意:这一题是陈启锋的论文中

HDU5109 Alexandra and A*B Problem(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5109 解题思路:BestCoder官方题解:

n皇后 - 位运算版

n皇后问题是大家在递归里会碰到的一个经典问题。以前高中我学DFS的时候,老师首先让我看的就是八皇后。不过这皇后的时间复杂度大家可想而知了。而接下来的位运算将这个效率重新提到一个高度。我是以前在Matr...

贪心算法——机器据木条(problem B)

贪心算法——机器据木条(problem B)

NYOJ-623:A*B Problem II

#include #include #include using namespace std; #define N 100 class Matrix { public: void Init(){ m...

Problem B: 平面上的点——Point类 (IV)

Problem B: 平面上的点——Point类 (IV) Time Limit: 1 Sec  Memory Limit: 4 MB Submit: 5378  Solved: 3147 [S...

【bzoj 十连测】[noip2016十连测第五场]Problem B: walk(dfs求最长链)

皑如山上雪,皎若云间月

A + B Problem II(利用字符串进行四则运算)

A + B Problem IITime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)