LightOJ 1024 Eid(高精度乘法+求n个数最小公约数)
题目链接:https://vjudge.net/contest/28079#problem/T
题目大意:给你n个数求这些数的最小公倍数(约数)。
解题思路:还太菜了,看了别人的题解才会写,转自这里,每个数的大小是1~10000,且有2~1000个数,可能达到1000个4位数相乘,所以结果很大,将近4000位。所以要使用高精度计算,而且不能直接按照我们平时计算最小公倍数的算法(循环过来),因为数字太大,所以要改变思路,我们可以把一个数进行素因数分解,然后找到所有分解出来的素数对应的最大次数,然后再按每个出现的素数及其次数把结果乘起来即可。
例如样例
4
5 6 30 60
5 : 5 //说明最小公倍数的因子中一定有一个5
6 : 2*3 //说明最小公倍数的因子中一定有一个2和一个3;
30 : 2*3*5 //说明最小公倍数的因子中一定有一个2和一个3和一个5;
60 : 2^2*3*5 //说明最小公倍数的因子中一定有2个2和一个3和一个5;
所以我们可以忽略那些个数比较少的, 找到说明结果中一定含有 2个2 1个3 1个5,然后相乘得到答案60。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e4+;
bool prime[N];
int cnt[N];
int ans[N]; void is_prime(void){
for(int i=;i<N;i++)
prime[i]=true;
for(int i=;i*i<N;i++){
if(prime[i]){
for(int j=i*i;j<N;j+=i){
prime[j]=false;
}
}
}
}
//万进制高精度乘法
void Mul(int a[],int num)
{
for(int i=; i<; i++)
a[i] = a[i]*num;
for(int i=; i<; i++)
{
a[i+] += a[i]/;
a[i] = a[i]%;
}
} void Puts(int a[]){
int pos=;
while(pos>=&&ans[pos]==)
pos--;
printf("%d",ans[pos--]);
while(pos>=)
printf("%04d",ans[pos--]);
printf("\n");
} int main(){
is_prime();
int T;
scanf("%d",&T);
int cas=;
while(T--){
memset(cnt,,sizeof(cnt));
memset(ans,,sizeof(ans));
int n;
scanf("%d",&n);
while(n--){
int x;
scanf("%d",&x);
int d=,count=;
//把数字进行素因子分解,用cnt[]记录每种素因子出现的最大次数
while(d<=x){
if(x%d==&&prime[d]){
x/=d;
count++;
cnt[d]=max(count,cnt[d]);
}
else{
d++;
count=;
}
}
}
//用高精度乘法,把素因子按对应次数乘起来
ans[]=;
for(int i=;i<N;i++){
if(cnt[i]){
int t=;
while(cnt[i]--)
t*=i;
Mul(ans,t);
}
}
//输出
printf("Case %d: ",++cas);
Puts(ans);
}
}
LightOJ 1024 Eid(高精度乘法+求n个数最小公约数)的更多相关文章
- LightOj 1024 - Eid (求n个数的最小公约数+高精度)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1024 题意:给你n(2<=n<=1000)个数, 然后求n个数的最小公倍数 ...
- Lightoj 1024 - Eid
求n个数的最小公倍数. import java.math.*; import java.io.*; import java.util.*; import java.text.*; public cla ...
- lightoj 1024 (高精度乘单精度)
题意:给你一些数,求它们的最小公倍数,结果可能会很大. 统计出每个素因子出现的最大次数,把他们相乘即可,需要高精度. #include<cmath> #include<cstdio& ...
- c# 判断一个数是不是质数或者求一个数的公约数的算法
一个数是不是质数,就是判断一个数除了1和它本身还有没有其他的约数,如果有则是合数,否则是质数.其实本质都是求公约数. 求公约数是什么思路呢,就是找比它小的数不断尝试,能被整除则是其约数,否则继续尝试, ...
- c++求最小公倍数和最小公约数
方法一:辗转相除法(欧几里得 Euclidean) 用“较大数”除以“较小数”,再用较小数除以第一余数,再用第一余数除以第二余数: 反复直到余数为零为止. #include<iostream&g ...
- 求N个数的最大公约数和最小公倍数(转)
除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表 ...
- ZZNUOJ-2154:单身狗线下聚会【求N个数的最小公倍数,会超longlong,大数乘法,Java】
2154: 单身狗线下聚会 题目描述 马上就到七夕节了,单身狗们决定聚一聚.但是它们沉迷B站上的lo娘,他们每沉迷 ai 单身狗时间(这是它们专业计时)后就会休息 单身狗时间.它们想找到一个时间正好他 ...
- JS高精度乘法计算问题(牛客网乘法-求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题)
用到的知识点===> toFixed(num); toFixed() 方法可把 Number 四舍五入为指定小数位数的数字; 参数num: 代表小数位数: 例:var num = 5.56789 ...
- Trailing Zeroes (I) LightOJ - 1028(求因子个数)
题意: 给出一个N 求N有多少个别的进制的数有后导零 解析: 对于一个别的进制的数要转化为10进制 (我们暂且只分析二进制就好啦) An * 2^(n-1) + An-1 * 2^(n-2) + `` ...
随机推荐
- 【BZOJ4912】天才黑客(最短路,虚树)
[BZOJ4912]天才黑客(最短路,虚树) 题面 BZOJ 洛谷 题解 \(Anson\)爷讲过的题目,然而我还是不会做 只有照着\(zsy\)的程序打我才会做....果然太弱了. 这道题目显然是把 ...
- 【BZOJ2109/2535】【NOI2010】航空管制(贪心)
[BZOJ2109/2535][NOI2010]航空管制(贪心) 题面 BZOJ2109 BZOJ2535 题解 很好玩的一道题目 先看第一问,显然是要找一个合法的拓扑排序的序列. 直接拓扑排序,把队 ...
- [学习笔记]搜索——模拟与dp的结合
搜索: 一种基础的算法. 考察常见于NOIP 但是高级的搜索算法可能还会在省选出现. 50%以上的暴力都可以用搜索直接枚举来写. 但是,当数据规模不是很大的时候,搜索也可能成为正解. (比如剪枝PK状 ...
- Codeforces 19.E Fairy
E. Fairy time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input ou ...
- python自学笔记(二)
通过前文介绍,大体上可以用学过的知识做一些东西了. 这里简单介绍下python参数解析argparse命令. 使用argparse需要引用 import argparse 然后调用 parser = ...
- STL源码分析-string
http://note.youdao.com/noteshare?id=c9b53b7d3379939aae7c05d1ea141a42
- .Net并行编程之二:并行循环
本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法 ...
- OpenCV---Numpy数组的使用以及创建图片
一:对头像的所有像素进行访问,并UI图像进行像素取反 (一)for循环取反 import cv2 as cv import numpy as np def access_pixels(image): ...
- spring boot 2.0.3+spring cloud (Finchley)5、路由网关Spring Cloud Zuul
Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由.过滤.监控.弹性伸缩和安全. 为什么需要Zuul Zuul.Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能:网关将 ...
- constant value too large
出错现场: .model small .data byte_var dw dup(-, dup()) .stack .code 将byte_var dw 'abc',10h,2 dup(-1,2 du ...