poj 3101Astronomy(圆周追击+分数最小公倍数)
/*
本题属于圆周追击问题:
假设已知两个圆周运动的物体的周期分别是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(圆周追击+分数最小公倍数)的更多相关文章
- poj 3101 Astronomy (java 分数的最小公倍数 gcd)
题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ...
- poj 3266 Cow School 分数规划
这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的. 那么问题就转化成了 ...
- POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim
http://172.20.6.3/Problem_Show.asp?id=1636 复习了prim,分数规划大概就是把一个求最小值或最大值的分式移项变成一个可二分求解的式子. #include< ...
- poj 3621 0/1分数规划求最优比率生成环
思路:以val[u]-ans*edge[i].len最为边权,判断是否有正环存在,若有,那么就是ans小了.否则就是大了. 在spfa判环时,先将所有点进队列. #include<iostrea ...
- poj Dropping tests 01分数规划---Dinkelbach算法
果然比二分要快将近一倍.63MS.二分94MS. #include <iostream> #include <algorithm> #include <cstdio> ...
- POJ 2976(01分数划分+二分)
Droppi ...
- hdu 1713 相遇周期
求分数的最小公倍数.对于a/b c/d 先化简为最简分数,分数最小公倍数=分子的最小公倍数/分母的最大公约数. ;}
- poj 3101 Astronomy(分数的最小公倍数)
http://poj.org/problem? id=3101 大致题意:求n个运动周期不全然同样的天体在一条直线上的周期. 这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的. 由 ...
- poj 3979 分数加减法
分数加减法 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13666 Accepted: 4594 Descriptio ...
随机推荐
- 客户端JS性能的一些优化的小技巧
下面是一些关于客户端JS性能的一些优化的小技巧:1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;). while().for(in).在这三种循环中 for(in) ...
- delphi 中如何查看网页POSTDATA
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool ...
- 读《我是IT小小鸟》后有感
我是一名大一新生,在下半学期开学时,我迎来新课程——<大学生职业生涯规划与就业指导 >.这是一门既新颖,又有许多就业知识和理论的学科.在课上,老师向我们推荐了一本书,名叫<我是IT小 ...
- Replication的犄角旮旯(一)--变更订阅端表名的应用场景
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- SQLSERVER中如何忽略索引提示
SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引, ...
- 【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都 ...
- STC12C5A60S2笔记6(中断)
1. 基本特性 1) 中断源 STC12C5A60S2共有十个中断源,每个中断源可设置4类优先级:当相同优先级下各中断优先级由高到低依次如下: 1.1)INT0(外部中断0) 中断向量地址 0003H ...
- 在VS2015 RC打开CTP中创建的工程
VS2015终于出了RC了!小伙伴们快来安装试用吧,地址在这里,还有新的Windows 10开发工具哦,要不然是开发不了Universal Windows App的,安装前记得卸载CTP版本. 新的R ...
- [每日电路图] 8、三轴加速度计LIS3DH电路图及功耗等指标
看TI的官网资料:http://www.st.com/web/en/catalog/sense_power/FM89/SC444/PF250725 一.初次接触关注的信息: 1.1.概述中的关键信息 ...
- [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”
NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...