/*
本题属于圆周追击问题:
假设已知两个圆周运动的物体的周期分别是a ,b, 设每隔时间t就会在同一条直线上
在同一条直线上的条件是 角度之差为 PI !
那么就有方程 (2PI/a - 2PI/b)* t=PI 所以就有 t=ab/(2|a-b|);
如果有多个物体, 就会有多个t值,所以每隔 所有 t值的最小公倍数的时间所有的物体就会在同一直线上! 另外:如果分数的分子分别是 a1, a2, ...., 和 b1, b2, ....
那么所有分数的最小公倍数就是lcm(a1, a2, ...)/gcd(b1, b2,....); 再有:如何求多个数的最小公倍数呢?
根据数论,每一个数都可以表示成素数的乘积的形式!
令p[i]存储素数,将a1,a2,...分别整除以p[i],直到除尽!并记录除以每个p[i]时的个数temp;
并更新该个数的最大值cnt[i]=max(temp, cnt[i]); 最后cnt[i]个p[i]分别相乘得到最终的结果就是所有数的最小公倍数!
*/
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#define M 10005
#define N 1005
using namespace std;
typedef long long LL;
LL p[M];
bool isP[M];
LL cnt[M];
LL q[N];
LL ans[N], endx;
LL top; void bigN(){//大数据的处理
LL c=;
endx=;
ans[]=;
for(LL i=; i<top; ++i)
for(LL j=; j<cnt[i]; ++j){
for(LL k=; k<=endx; ++k){
ans[k]=ans[k]*p[i] + c;
c=ans[k]/;
ans[k]%=;
}
if(c>){
ans[++endx]=c;
c=;
}
}
} void isPrime(){
LL i, j;
isP[]=;
for(i=; i<M; ++i){
if(!isP[i]) p[top++]=i;
for(j=; j<top && i*p[j]<M; ++j){
isP[i*p[j]]=;
if(i%p[j]==) break;
}
}
} void solve(LL k){
for(LL i=; i<top && p[i]<=k; ++i){
LL tmp=;
while(k%p[i]==){
++tmp;
k/=p[i];
} if(tmp>cnt[i])
cnt[i]=tmp;
}
} LL gcd(LL a, LL b){
while(b){
LL r=a%b;
a=b;
b=r;
}
return a;
} int main(){
LL n;
isPrime();
while(scanf("%lld", &n)!=EOF){
memset(cnt, , sizeof(cnt));
scanf("%lld", &q[]);
for(LL i=; i<n; ++i){
scanf("%lld", &q[i]);
LL tmp=q[]-q[i]> ? q[]-q[i] : q[i]-q[];
if(tmp!=){
LL GCD=gcd(tmp, q[]*q[i]);
solve(q[]*q[i]/GCD);
q[i]=tmp/GCD;
}
else q[i]=;
} LL ans2=;
for(LL i=; i<n; ++i)
ans2=gcd(ans2, q[i]);
if(cnt[]>)//除以2
--cnt[];
else ans2*=; bigN();
if(ans2==){
endx=;
ans[endx]=;
}
printf("%lld", ans[endx]);
for(int i=endx-; i>=; --i)
printf("%04lld", ans[i]);
printf(" %lld\n", ans2);
}
return ;
}
 //用java爽一下,处理大数
import java.util.Scanner;
import java.util.Arrays;
import java.math.*;
import java.io.BufferedInputStream;
class Main{
static int[] tt = new int[1005];
static int n;
static int top=0;
static boolean[] flag = new boolean[10005];
static int[] p = new int[10005];
static int[] q = new int[10005];
static int[] aa = new int[10005];
public static void isprime(){
int i, j;
Arrays.fill(flag, false);
for(i=2; i<=10000; ++i){
if(!flag[i]) p[top++]=i;
for(j=0; j<top && i*p[j]<=10000; ++j){
flag[i*p[j]]=true;
if(i%p[j]==0) break;
}
}
--top;
flag[1]=true;
}
public static void solve(int k){
int i, cnt;
for(i=0; i<=top && p[i]<=k; ++i){
cnt=0;
while(k%p[i]==0){
++cnt;
k=k/p[i];
}
if(cnt>aa[i])
aa[i]=cnt;
}
} public static int gcd(int a, int b){
while(b!=0){
int r=a%b;
a=b;
b=r;
}
return a;
} public static void main(String[] args){
isprime();
Scanner input = new Scanner(new BufferedInputStream(System.in));
n=input.nextInt();
q[0]=input.nextInt();
for(int i=1; i<n; ++i){
q[i]=input.nextInt();
int temp=Math.abs(q[0]-q[i]);
if(temp!=0){
int GCD=gcd(temp, q[0]*q[i]);
solve(q[0]*q[i]/GCD);
q[i]=temp/GCD;
}
else q[i]=0;
} BigInteger bigN = BigInteger.ONE;
for(int i=0; i<=top; ++i){
for(int j=0; j<aa[i]; ++j)
bigN=bigN.multiply(BigInteger.valueOf(p[i]));
}
for(int i=0; i<=top; ++i)
if(aa[i]!=0)
System.out.println(p[i]+" "+aa[i]);
int ans=0;
for(int i=1; i<n; ++i){
ans=gcd(ans, q[i]);
}
if(aa[0]>0)
bigN=bigN.divide(BigInteger.valueOf(2));
else ans*=2;
if(ans==0)
bigN=BigInteger.ZERO;
System.out.println(bigN+" "+ans);
}
}

poj 3101Astronomy(圆周追击+分数最小公倍数)的更多相关文章

  1. poj 3101 Astronomy (java 分数的最小公倍数 gcd)

    题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ...

  2. poj 3266 Cow School 分数规划

    这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的. 那么问题就转化成了 ...

  3. POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim

    http://172.20.6.3/Problem_Show.asp?id=1636 复习了prim,分数规划大概就是把一个求最小值或最大值的分式移项变成一个可二分求解的式子. #include< ...

  4. poj 3621 0/1分数规划求最优比率生成环

    思路:以val[u]-ans*edge[i].len最为边权,判断是否有正环存在,若有,那么就是ans小了.否则就是大了. 在spfa判环时,先将所有点进队列. #include<iostrea ...

  5. poj Dropping tests 01分数规划---Dinkelbach算法

    果然比二分要快将近一倍.63MS.二分94MS. #include <iostream> #include <algorithm> #include <cstdio> ...

  6. POJ 2976(01分数划分+二分)

                                                                                                  Droppi ...

  7. hdu 1713 相遇周期

    求分数的最小公倍数.对于a/b c/d 先化简为最简分数,分数最小公倍数=分子的最小公倍数/分母的最大公约数. ;}

  8. poj 3101 Astronomy(分数的最小公倍数)

    http://poj.org/problem? id=3101 大致题意:求n个运动周期不全然同样的天体在一条直线上的周期. 这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的. 由 ...

  9. poj 3979 分数加减法

    分数加减法 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13666   Accepted: 4594 Descriptio ...

随机推荐

  1. 网页中插入FLASH(swf文件)的html代码

    一.简单插入flash图像<embed src="你的flash地址.swf"width="300" height="220"> ...

  2. 数据库、数据表的创建SP2

      本人前一个版本的数据库.数据表的创建由于不是很详细,于是通过细心的修订,已经修复了很多Bug,希望这篇文章能够给大家一些帮助 --代表注释,相当于C#里的// --切换到master数据库,目的是 ...

  3. [Xpand] Error 1 Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default

    原因是用的vs2015 默认用了c#6 ,但是在没安装.net 4.6 环境下编译失败. 解决办法很简单,修改 6 为 5 做降级就可以了. 1.nuget install DotNetCompile ...

  4. phpcms v9 标签含义整理

    {template "content","header"}   ----------  调用根目录下phpcms\template\content\header ...

  5. [leetcode 27]Implement strStr()

    1 题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...

  6. vs的dll引用机制

    vs2012编译的时候,遇到一个问题就是项目A中运行时缺失dll的问题,项目A引用类库B,类库B引用了x,y等dll,编译A项目的时候,出现x没拷贝到bin 目录. 通过跟踪编译输出发现,x没拷贝的原 ...

  7. Understanding ASP.NET MVC Filters and Attributes

    这篇文章把Asp.net MVC的filter介绍的很详细,值得收藏. http://www.dotnet-tricks.com/Tutorial/mvc/b11a280114-Understandi ...

  8. 将EnyimMemcached从.NET Core RC1升级至RC2

    .NET Core RC1时project.json中的配置如下: { "version": "3.2.4", "summary": &qu ...

  9. STC12C5A60S2笔记6(中断)

    1. 基本特性 1) 中断源 STC12C5A60S2共有十个中断源,每个中断源可设置4类优先级:当相同优先级下各中断优先级由高到低依次如下: 1.1)INT0(外部中断0) 中断向量地址 0003H ...

  10. DBCP连接池使用问题

    问题现象: 启动应用,访问无压力,一切正常,一段时间过后,应用访问异常. 问题分析: 1.web容器线程爆满,拒绝服务.由于应用并发量大,线程响应时间长增加,线程池连接数逐步递增直到爆满,导致应用拒绝 ...