2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
最小公倍数(lcm.c/.cpp/.pas)
题目描述
给定两个正整数,求他们的最小公倍数。
样例输入
28 12
样例输出
84
数据范围
对于40%数据:1<=a,b<=10^9
对于60%的数据:1<=a,b<=10^12
对于100%数据:1<=a,b<=10^100
提示:为了略微降低题目难度,增加以下条件:
1. 输入数据保证a>=b
2. 输入数据保证a、b没有前导0
3. 输入数据保证除了在两个正整数a、b之间的空格和行末换行符以外,不存在其他非数字字符
最后友情提醒:高精除高精写二分做法风味更佳
其实就是superlcm啦……
先算出gcd(a,b),然后lcm(a,b)=a*b/gcd(a,b)
40分是暴力,60分lcm(a,b)=a/gcd(a,b)*b,这样不会爆long long
100分就呵呵了,你只要写高精度减法、乘法、除法就好了
给现场怒写高精度还A了的hzwer跪了
这其实可以当成模板来用
#define mx 300
#include<cstdio>
#include<iostream>
using namespace std;
struct gaojing{
int len;
int a[mx+10];
};//定义高精度非负数类型
gaojing zero,one;
inline void set0(gaojing &s)
{
s.len=1;
for (int i=1;i<=mx+5;i++)s.a[i]=0;
}
inline void inputn(gaojing &a)
{
set0(a);
char ch=getchar();
while (ch<'0'||ch>'9')ch=getchar();
while (ch>='0'&&ch<='9')
{
a.a[a.len++]=ch-'0';
ch=getchar();
}
a.len--;
int change[mx+15];
for (int i=1;i<=a.len;i++)
change[i]=a.a[i];
for (int i=1;i<=a.len;i++)
a.a[i]=change[a.len-i+1];
while (a.a[a.len]==0)a.len--;
}
inline void put(gaojing a)
{
for (int i=a.len;i>=1;i--)printf("%d",a.a[i]);
printf("\n");
}
inline bool operator < (const gaojing &a,const gaojing &b)
{
if (a.len<b.len)return 1;
if (a.len>b.len)return 0;
for (int i=a.len;i>=1;i--)
{
if (a.a[i]<b.a[i])return 1;
if (a.a[i]>b.a[i])return 0;
}
return 0;
}
inline bool operator == (const gaojing &a,const gaojing &b)
{
if (a.len!=b.len)return 0;
for (int i=a.len;i>=1;i--)
{
if (a.a[i]!=b.a[i])return 0;
}
return 1;
}
inline gaojing max(const gaojing &a,const gaojing &b)
{
if (a<b)return b;
else return a;
}
inline gaojing min(const gaojing &a,const gaojing &b)
{
if (a<b)return a;
else return b;
}
inline gaojing operator + (const gaojing &a,const gaojing &b)
{
gaojing c;set0(c);
int maxlen=max(a.len,b.len);
for (int i=1;i<=maxlen;i++)
{
c.a[i]=c.a[i]+a.a[i]+b.a[i];
if (c.a[i]>=10)
{
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
}
c.len=maxlen+4;
while (!c.a[c.len]&&c.len>1) c.len--;
return c;
}
inline gaojing operator - (const gaojing &a,const gaojing &b)
{
gaojing c;set0(c);
gaojing d;d=a;
for (int i=1;i<=b.len;i++)
{
c.a[i]=d.a[i]-b.a[i];
if (c.a[i]<0)
{
c.a[i]+=10;
int now=i+1;
while (!d.a[now])
{
d.a[now]=9;
now++;
}
d.a[now]--;
}
}
for (int i=b.len+1;i<=d.len;i++)c.a[i]=d.a[i];
c.len=d.len;
while (c.a[c.len]==0&&c.len>1)c.len--;
return c;
}
inline gaojing operator * (const gaojing &a,const gaojing &b)
{
gaojing c;set0(c);
for(int i=1;i<=a.len;i++)
for (int j=1;j<=b.len;j++)
c.a[i+j-1]+=a.a[i]*b.a[j];
c.len=a.len+b.len+5;
for (int i=1;i<=c.len;i++)
{
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
while (!c.a[c.len]&&c.len>1)c.len--;
return c;
}
inline void div_by_2(gaojing &a)
{
for (int i=a.len;i>=1;i--)
{
if (a.a[i]&1 && i!=1)a.a[i-1]+=10;
a.a[i]/=2;
}
while (!a.a[a.len]&&a.len>1)a.len--;
}
inline gaojing operator / (gaojing a,const gaojing &b)
{
gaojing l,r,ans;
set0(l);l.len=1;
set0(r);r=a;
set0(ans);ans.len=1;
while (l<r||l==r)
{
gaojing mid=l+r;
div_by_2(mid);
if(mid*b==a)return mid;
if(mid*b<a){ans=mid;l=mid+one;}
if(a<mid*b)r=mid-one;
}
return ans;
}
inline void chushihua()
{
set0(zero); zero.len=1;
set0(one);one.len=1;one.a[1]=1;
}
inline gaojing gcd(const gaojing &a,const gaojing &b)
{
if (b==zero)return a;
return gcd(b,a-a/b*b);
}
int main()
{
gaojing a,b;
chushihua();
inputn(a);
inputn(b);
put(a/gcd(a,b)*b);
}
2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数的更多相关文章
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠
笨笨太好玩了,农田荒芜了,彩奖用光了,笨笨只好到处找工作,笨笨找到了一份粉刷匠的工作.笨笨有n条木板需要被粉刷.每条木板被分成m个格子,每个格子要被刷成红色或蓝色.笨笨每次粉刷,只能选择一条木板上一段 ...
- 11.12模拟考T1(可持续优化)PS:神奇的东西
1.数列操作 (array.pas/c/cpp) [问题描述] 现在有一个数列,最初包含0个数.现在要对数列操作n次,操作有3类. 1) a k,在数列的最后插入一个整数k 2) s 将最近插入的 ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 11.17 模拟赛&&day-2
/* 后天就要复赛了啊啊啊啊啊. 可能是因为我是一个比较念旧的人吧. 讲真 还真是有点不舍. 转眼间一年的时间就过去了. 2015.12-2016.11. OI的一年. NOIP gryz RP++. ...
- 11.12模拟考T2(GCD)
2.梅花桩 (blossom.pas/c/cpp) [问题描述] 小x在练习一门轻功,这门轻功是在梅花桩上跳来跳去,这门轻功是严格按照直线从一个梅花桩直接跳到另外一个梅花桩上.因为小x有恐高症,所 ...
- 2014.7.7 模拟赛【小K的农场】
3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...
随机推荐
- C++基础回顾1(数据类型, 控制语句, 数组)
最近两天打开本科学校的C++教材,快速回顾了一下C++方面的内容.虽然书本内容比较基础,但是还是有些知识点值得自己强化记忆.分几篇文章,加上自己的理解记录如下. 先回顾面向过程的部分. C++数据类型 ...
- You don't have permission to access / on this server for debian_8
Forbidden You don't have permission to access / on this server. Apache/2.4.10 (Debian) Server at www ...
- Java并发编程:性能、扩展性和响应
1.介绍 本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实 ...
- linux内存管理--伙伴系统和内存分配器
3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...
- Javascript:作用域 学习总结
作用域(scope): 变量与函数的可访问范围,控制着变量与函数的可见性和生命周期 作用域分类: javascript中,变量的作用域分为:全局作用域,局部作用域 局部变量的优先级大于全局变量,或 ...
- oendir(),readdir(),closedir() 打开/读取/关闭目录
目录操作 当目标是目录而不是文件的时候,ls -l的结果会显示目录下所有子条目的信息,怎么去遍历整个目录呢?答案马上揭晓! 1. 打开目录 功能:opendir()用来打开参数name指定的目录,并返 ...
- artDialog Error: document.compatMode === "BackCompat 报错原因
今天在使用artDialog的时候报错了提示artDialog Error: document.compatMode === "BackCompat 查了网上说 可以设置<!DOCTY ...
- Java关键字transient和volatile
transient标记的变量,在进行序列化的时候,这个字段不进行序列化操作. volatile标记的变量,在进行读写时,必须强制的与内存同步,即在读的时候需要从内存中读取,写的时候也需要回写到内存中. ...
- QTP描述性编程中往WebEdit控件输入文字问题
在网上查找到许多相关的描述性编程的案例,自己就想动手一试,于是在专家视图中输入如下代码: systemUtil.Run "http://www.baidu.com" wait(15 ...
- Linux-统一事件源
概念: 信号时一种异步事件:信号处理函数和程序的主循环式两条不同的执行路线,信号处理函数需要尽可能快地执行完毕,以确保该信号不被屏蔽.(为了避免一些竞态条件,信号在处理期间,系统不会再次出发它)太久. ...