lightoj 1215 Finding LCM

链接http://www.lightoj.com/volume_showproblem.php?problem=1215

题意:已知 a, b, l 和 lcm(a, b, c) = l ,求最小的 c 的值。

思路:先找 l 的素因子并判断此因子是否为 a, b 的素因子,如果是,则判断他们各自的欧拉值的大小。因为 c 最大可能等于 l 的值,所以刚开始先把 l 的值赋给 c 。

  当 l 中的某个素因子的欧拉值(lr1)大于 a,b 中相同的素因子的欧拉值(ar1, br1)时,c中肯定含有次素因子并且欧拉值(cr1 >= lr1 ),然而 c 是 l 的因子,所以(cr1 <= lr1 ), 所以 cr1 == lr1 ,不用进行处理。

  当 l 中的某个素因子的欧拉值(lr1)等于(最大就是等于,不可能小于) a,b 中相同的素因子的欧拉值(ar1, br1)时,c中不一定含有次素因子,当 c 要取最小时,就可以不含有这个素因子,所以就把 c 中的 此素因子除干净。

代码

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; typedef long long LL;
const int N = ;
bool tag[N];
int prime[];
int k = ;
LL a, b ,c, l; LL stein(LL a, LL b) //stein 公式求最大公约数
{
if(a < b) swap(a, b);
if(!b) return a;
if(!(a&) && !(b&)) return * stein(a>>, b>>);
if(!(a&)) return stein(a>>, b);
if(!(b&)) return stein(a, b>>);
return stein((a-b)>>, b);
}
//当然,你也可以用欧几里得
LL gcd(LL a, LL b)
{
return b ? gcd(b, a%b) : a;
} int euler(LL *n, int m) //计算欧拉函数: 此函数中 n 值的变化会传回原处
{
int e = ;
while(!((*n) % m))
e++, (*n) /= m;
return e;
} void prm() //素数表(线性素数筛法)
{
int i,j;
memset(tag, , sizeof(tag));
tag[] = , prime[k++] = ;
for(i = ; i < N; i += )
{
if(!tag[i]) prime[k++] = i;
for(j = ; j < k && i*prime[j] < N; ++j)
{
tag[i*prime[j]] = ;
if(i%prime[j] == ) break;
}
}
} void ct(int q) //计算c值
{
int i, cnta, cntb, cntL, cnt0, cs = ;
c = l; // c 最大可能等于c, 先赋值为c,遇到情况在做除法减小它
if(l % (a/stein(a,b)*b)) //不可能的情况:l 不是(a, b)的最小公倍数的倍数
{
printf("Case %d: impossible\n", q);
return;
}
for(i=; i < k && (prime[i] <= a || prime[i] <= b); i++) //
{
cnta = cntb = ;
if(!(l%prime[i])) //是某个素数倍数的时候
{
cntL = euler(&l, prime[i]); // l 部分欧拉函数值
if(!(a%prime[i])) // 当这个素数也是a 的因子的时候
cnta = euler(&a, prime[i]); // a 的部分欧拉函数值
if(!(b%prime[i])) //当这个素数也是b 的因子的时候
cntb = euler(&b,prime[i]); //同 a 的操作
cnt0 = cnta > cntb ? cnta : cntb; // 最小公倍数当然是取值较大欧拉值
/*
a,b里边因子的欧拉值肯定要小于等于l的相同的因子的欧拉值的,当相等时,c要取最小就必须不含此因子
当a, b 中的因子的欧拉值都小于l中的时,c中相同因子的欧拉值必须大于等于l中的值,最小当然取等于啦
这也是为什么下面的只处理等于的情况
*/
if(cntL == cnt0)
while(cnt0--)
c /= prime[i];
}
}
if(a > && euler(&l, a) <= ) c /= a; //当 a 中含有大于1000的素数时的处理a
if(b > && euler(&l, b) <= ) c /= b; //当 b 中含有大于1000的素数时的处理b
printf("Case %d: %lld\n", q, c);
} int main()
{
int t, q=;
prm();
scanf("%d", &t);
while(t--)
{
scanf("%lld%lld%lld", &a, &b, &l);
ct(q++);
}
return ;
}

lightoj 1215的更多相关文章

  1. Finding LCM LightOJ - 1215 (水题)

    这题和这题一样......只不过多了个数... Finding LCM LightOJ - 1215 https://www.cnblogs.com/WTSRUVF/p/9316412.html #i ...

  2. LightOj 1215 - Finding LCM(求LCM(x, y)=L中的 y )

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1215 题意:已知三个数a b c 的最小公倍数是 L ,现在告诉你 a b  L 求最 ...

  3. LightOj 1215 Finding LCM

    Discription LCM is an abbreviation used for Least Common Multiple in Mathematics. We say LCM (a, b, ...

  4. LightOj 1236 - Pairs Forming LCM (分解素因子,LCM )

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1236 题意:给你一个数n,求有多少对(i,  j)满足 LCM(i, j) = n, ...

  5. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  6. LightOj 1298 - One Theorem, One Year(DP + 欧拉)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...

  7. 1214 - Large Division -- LightOj(大数取余)

    http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...

  8. LightOJ Beginners Problems 部分题解

    相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...

  9. LightOJ 1341 唯一分解定理

    Aladdin and the Flying Carpet Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld &a ...

随机推荐

  1. mysql 5.5 zip配置安装

    1.解压2.创建option文件 --defaults-file=../my.ini [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mys ...

  2. 239. [LeetCode ]Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  3. node.js常用方法

    1.获取真实地址 function getClientIp(req) { return req.headers['x-forwarded-for'] || req.connection.remoteA ...

  4. ADAS芯片解决方案汇总

    ADAS(高级辅助驾驶系统),是指利用安装于车上各式各样的传感器,在第一时间收集车内的环境数据,进行静.动态物体的辨识.侦测与追踪等技术上的处理,从而能够让驾驶者在最快的时间察觉可能发生的危险. 在过 ...

  5. scrum立会报告+燃尽图(第二周第四次)

    此作业要求参考: https://edu.cnblogs.com/campus/nenu/2018fall/homework/2249 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...

  6. "Hello World"团队召开的第三周第七次会议

    今天是我们团队“Hello World!”团队召开的第三周的第七次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时 ...

  7. lintocde-247-线段树的查询 II

    247-线段树的查询 II 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现 ...

  8. 结对编程--fault,error,failure的程序设计

    一.结对编程内容: 1.不能触发Fault. 2.触发Fault,但是不触发Error. 3.触发Error,但不触发Failure. 二.结对编程人员 1.周浩,周宗耀 2.结对截图: 三.结对项目 ...

  9. 理解promise 01

    原文地址: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html 用Javascript的小伙伴们,是时候承认了,关于 ...

  10. [OS] 系统调用