关闭

A*B Problem

标签: 二进制编程Pascal
503人阅读 评论(0) 收藏 举报

【题目描述】
给出一个数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.
3
0
查看评论

高精度——A*B Problem

洛谷 P1303 A*B Problem 题目描述 求两数的积。分析 高精乘var s1,s2:ansistring; a,b,c:array[0..100000]of longint; i,j:longint; begin readln(s1); readln(s2); a...
  • SSL_QYH0Ice
  • SSL_QYH0Ice
  • 2017-02-10 20:14
  • 225

A/B Problem

A/B Problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述  做了A+B Problem,A/B Problem不是什么问题了吧! 输入每组测试样例一行,首先一个号码...
  • zuguodexiaoguoabc
  • zuguodexiaoguoabc
  • 2015-02-01 12:57
  • 448

杭电1002 a+b problem2

A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 294530&#...
  • xd15010130025
  • xd15010130025
  • 2016-02-27 21:52
  • 849

杭电ACM 1002:A+B Problem II

刷题第三篇,这一题看似也比较简单,但是一做就错,花费了很大力气才把他搞定。切记一定要亲自用笔画图算出,这样收获才会更大。原题回顾Problem Description I have a very simple problem for you. Given two integers A and B...
  • Always2015
  • Always2015
  • 2015-04-07 22:27
  • 3431

NYOJ---A+B Problem II

这个题的思路就是大数加法,把大数当成一个字符串来就行运算。不过这个代码的亮点就是他不需要顾及两个数的长短问题。所以把它贴出来········· 原题地址:点击打开链接 代码如下: #include...
  • OosuifengoO
  • OosuifengoO
  • 2011-12-20 20:22
  • 2490

高精度 A*B Problem

题目:请戳此处 #include #include #include char s[30000],l[30000]; long long a[30001],b[30001],c[60000],al,bl,cl,i,j,x; int main() {gets(s); al=strlen(s); ...
  • YALI_xunzhen
  • YALI_xunzhen
  • 2016-02-04 15:07
  • 263

NYOJ A+B Problem II(大数A+B)

A+B Problem II 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 I have a very simple problem for you. Given two integers A a...
  • zwj1452267376
  • zwj1452267376
  • 2015-01-10 16:59
  • 610

ZOJ 1001 A + B Problem(Java解法)

import java.util.Scanner; public class Main{     public static void main(String[] args) {         Sc...
  • CZJCC
  • CZJCC
  • 2014-03-03 11:03
  • 2030

BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)

竟然在BZOJ上拿了Rank1太给力啦。 传送门(BZOJ) 传送门(UOJ) 说说这道题目吧: 首先是说说这个构图吧。因为有选择关系,我们很容易想到最小割。 Ans = sigma(i为白色){w[i]} + sigma(i为黑色){b[i]} - sigma(奇怪的i){p[...
  • geng4512
  • geng4512
  • 2016-02-24 00:34
  • 1440

a+b problem 2

A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3196 Accepted Sub...
  • zx8225885qw
  • zx8225885qw
  • 2016-05-30 23:09
  • 279
    个人资料
    • 访问:238754次
    • 积分:3756
    • 等级:
    • 排名:第10195名
    • 原创:176篇
    • 转载:22篇
    • 译文:0篇
    • 评论:18条
    个人主页
    www.jrxblog.top 欢迎访问&交换友链!
    博客专栏