2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
?
最小公倍數(shù)(lcm.c/.cpp/.pas)
題目描述
??? 給定兩個(gè)正整數(shù),求他們的最小公倍數(shù)。
樣例輸入
28 12
樣例輸出
84
數(shù)據(jù)范圍
對(duì)于40%數(shù)據(jù):1<=a,b<=10^9
對(duì)于60%的數(shù)據(jù):1<=a,b<=10^12
對(duì)于100%數(shù)據(jù):1<=a,b<=10^100
?
提示:為了略微降低題目難度,增加以下條件:
1. 輸入數(shù)據(jù)保證a>=b
2. 輸入數(shù)據(jù)保證a、b沒有前導(dǎo)0
3. 輸入數(shù)據(jù)保證除了在兩個(gè)正整數(shù)a、b之間的空格和行末換行符以外,不存在其他非數(shù)字字符
?
最后友情提醒:高精除高精寫二分做法風(fēng)味更佳
?
其實(shí)就是superlcm啦……
先算出gcd(a,b),然后lcm(a,b)=a*b/gcd(a,b)
40分是暴力,60分lcm(a,b)=a/gcd(a,b)*b,這樣不會(huì)爆long long
100分就呵呵了,你只要寫高精度減法、乘法、除法就好了
給現(xiàn)場怒寫高精度還A了的hzwer跪了
這其實(shí)可以當(dāng)成模板來用
#define mx 300 #include<cstdio> #include<iostream> using namespace std; struct gaojing{int len;int a[mx+10]; };//定義高精度非負(fù)數(shù)類型 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); }
轉(zhuǎn)載于:https://www.cnblogs.com/zhber/p/4093520.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 1524 - Hot or Co
- 下一篇: Qt 读写XML文件