POJ3101 大数+LCM
来源:互联网 发布:脐带血公司 知乎 编辑:程序博客网 时间:2024/06/05 23:50
不是很难,倒是写大数类用了很久,由于要考虑到中间过程会出现long long 的情况,大数类里面的东西要用long long 写,包括,除法,取模运算什么的。
N个分数的的最小公倍数是分子的最小公倍数,分母的最大公约数。
(1/2)/(1/t1-1/t2)得到时间间隔,化简得到t1*t2/(2*(t2-t1))
#include <string.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <iostream>#include <algorithm>#define NNN cout<<'\n';using namespace std;long long a[1111],b[1111];long long que=0;long long absMy(long long aa){ if(aa<0) return -aa; else return aa;}class BigInteger{public: long long num[1000]; long long len; BigInteger() { len=0; memset(num,0,sizeof(num)); } BigInteger(char* ss) { len=0; memset(num,0,sizeof(num)); long long& i=this->len; long long lenofss=strlen(ss); char s[10]={0}; for(i=0;lenofss/4;lenofss-=4) { strncpy(s,ss+lenofss-4,4); this->num[i++]=atoi(s); } if(lenofss) { memset(s,0,sizeof(s)); strncpy(s,ss,lenofss); this->num[i++]=atoi(s); } }BigInteger(long long s){len=0;memset(num,0,sizeof(num));while(s>10000){num[len++]=s%10000;s/=10000;}if(s){num[len++]=s;}if(s==0) len=1;} void Print() { long long i; printf("%lld",num[len-1]); for(i=this->len-2;i>=0;i--) { printf("%04lld",this->num[i]); }//printf("\n"); } BigInteger Times(BigInteger sec)//该数本身没有变化,只是返回了结果 { long long i,j,jw; BigInteger ans; for(i=0;i<len;i++) { jw=0; ans.len=i; for(j=0;j<sec.len;j++) { jw+=this->num[i]*sec.num[j]+ans.num[ans.len]; ans.num[ans.len++]=jw%10000; jw/=10000; } while(jw) { jw+=ans.num[ans.len]; ans.num[ans.len++]=jw%10000; jw/=10000; } } return ans; } BigInteger plusone() { long long i=0; do { num[i]++; num[i+1]+=num[i]/10000; num[i]%=10000; i++; }while(num[i]<9999); return *this; }BigInteger operator+(const BigInteger& sec){bool isUp=false;BigInteger tmp=*this;for(long long i=0;i<this->len;i++){if(isUp){tmp.num[i]++;if(tmp.num[i]>=10000){tmp.num[i]=0;isUp=true;}}if(tmp.num[i]+sec.num[i]<=9999){tmp.num[i]+=sec.num[i];isUp=false;}else{tmp.num[i]=tmp.num[i]+sec.num[i]-10000;isUp=true;}}long long maxn=tmp.len>sec.len?tmp.len:sec.len;if(tmp.num[maxn]!=0) tmp.len++; else tmp.len=maxn;return tmp;}BigInteger operator-(const BigInteger& sec)//big-small{bool isBorrow=false;BigInteger tmp=*this;for(long long i=0;i<this->len;i++){if(isBorrow){tmp.num[i]-=1;if(tmp.num[i]<0)tmp.num[i]=9999;}if(tmp.num[i]<sec.num[i]){tmp.num[i]=tmp.num[i]+10000-sec.num[i];isBorrow=true;}else{tmp.num[i]-=sec.num[i];isBorrow=false;}}long long i=0;for(i=999;i>=0;i--) { if(tmp.num[i]!=0) break; } if(i==-1) tmp.len=1; else tmp.len=i+1;return tmp;} BigInteger operator*(const BigInteger sec) { return this->Times(sec); }BigInteger operator/(long long sec)//big/small{ /*if(sec==1) return *this;*/ BigInteger ret; long long i,down=0;for(i=len-1;i>=0;i--) { ret.num[i]=(num[i]+down*10000)/sec; down=num[i]+down*10000-ret.num[i]*sec; } ret.len=len; while(ret.num[ret.len-1]==0&&ret.len>1) ret.len--; return ret;}BigInteger operator%(long long sec){BigInteger tmp=*this;BigInteger shang=tmp/sec;BigInteger big_sec=BigInteger(sec);BigInteger ans=tmp-shang*big_sec;return ans;}BigInteger& operator++() { this->plusone(); return *this; }bool operator<=(const BigInteger& sec){if(len<sec.len)return true;for(long long i=len-1;i>=0;i--){if(num[i]>sec.num[i])return false;}return true;}bool operator>=(const BigInteger& sec){if(len>sec.len)return true;for(long long i=len-1;i>=0;i--){if(num[i]<sec.num[i])return false;}return true;}bool operator==(const BigInteger& sec){if(len!=sec.len)return false;for(long long i=len-1;i>=0;i--){if(num[i]!=sec.num[i])return false;}return true;}bool operator==(const long long& sec){if(len!=1)return false;if(num[0]==sec)return true;elsereturn false;}bool operator<(const BigInteger& sec){if(len<sec.len)return true;for(long long i=len-1;i>=0;i--){if(num[i]>sec.num[i])return false;else if(num[i]<sec.num[i])return true;}return false;}bool operator>(const BigInteger& sec){if(len>sec.len)return true;for(long long i=len-1;i>=0;i--){if(num[i]<sec.num[i])return false;else if(num[i]>sec.num[i])return true;}return false;}bool operator!=(const BigInteger& sec){if(len!=sec.len)return true;for(long long i=len-1;i>=0;i--){if(num[i]!=sec.num[i])return true;}return false;}/*BigInteger GCD(const BigInteger& first,const BigInteger& sec){return first%sec==0?sec:GCD(sec,first%sec);}BigInteger LCM(const BigInteger& first,const BigInteger& sec){return first/GCD(first,sec)*sec;}*/};long long gcd(long long a,long long b){ if(a<b) swap(a,b); return b==0?a:gcd(b,a%b);}long long lcm(long long a,long long b){ return a/gcd(a,b)*b;}int main(){ //freopen("D:/1.txt","r",stdin);//freopen("D:/my.txt","w",stdout); long long n; long long first; cin>>n; for(long long i=0;i<n;i++) { long long time; cin>>time; if(!i) first=time; else if(first!=time) { long long tmp=gcd(first*time,2*absMy(first-time)); a[que]=first*time/tmp; b[que++]=2*absMy(first-time)/tmp; first=time; } } if(que==1) { printf("%lld %lld\n",a[0],b[0]); } else { long long gcdnum; gcdnum=gcd(b[0],b[1]); for(long long i=2;i<que;i++) { gcdnum=gcd(gcdnum,b[i]); } long long ans2=gcdnum; BigInteger a0=BigInteger(a[0]); BigInteger a1=BigInteger(a[1]); BigInteger lcmnum=a0*a1/gcd(a[0],a[1]); BigInteger bigai; BigInteger modn_big; long long tmpgcd; for(long long i=2;i<que;i++) { modn_big=lcmnum%a[i]; long long modn=modn_big.num[1]*10000+modn_big.num[0]; tmpgcd=gcd(a[i],modn); bigai=BigInteger(a[i]); lcmnum=bigai*lcmnum/tmpgcd; /*cout<<"TMPGCDis: "; lcmnum.Print(); NNN cout<<"lcmis: "; lcmnum.Print(); NNN cout<<"lcmis: "; lcmnum.Print(); NNN*/ } lcmnum.Print(); printf(" %lld\n",ans2); }}
0 0
- POJ3101 大数+LCM
- gcd&lcm模板(poj3101验证)
- poj3101
- POJ3101 Astronomy【素因子分解】【大数乘法】
- poj3101——Astronomy(大数数学&gcd)
- (转)POJ3101 Astronomy【素因子分解】【大数乘法】
- POJ 3101 Astronomy (大数+LCM)
- [POJ3101]Astronomy
- poj 3101 Astronomy 分数lcm+大数java
- POJ 2429 GCD & LCM Inverse Pollard_rho大数因子分解
- POJ 2429 GCD & LCM Inverse 解题报告(大数因式分解)
- POJ 2429 GCD & LCM Inverse (大数分解)
- POJ 2429GCD & LCM Inverse(大数分解)
- poj 2429 GCD & LCM Inverse(Miller_rabin 测试+pollard_rho大数分解)
- POJ 2429 GCD & LCM Inverse Pollard_Rho大数分解+Miller_Rabin
- poj 2429 GCD & LCM Inverse(大数质因数分解+DFS)
- lcm
- LCM~~~!!!
- hdu 2553N皇后问题
- Maven核心概念的理解
- linux内核驱动开发--编译外部模块
- java1.5 新特性 自动装箱和拆箱
- 【驱动之二】IO_STACK_LOCATION总结
- POJ3101 大数+LCM
- JS 删除字符串最后一个字符的几种方法
- 存储器的重映射
- C#中用接口实现鸭子案例
- 程序员写给同事的一封信
- 用 JAAS 和 JSSE 实现 Java 安全性
- HDU 1224 Free DIY Tour
- C3P0连接池配置
- uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))