lightoj 1215
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的更多相关文章
- Finding LCM LightOJ - 1215 (水题)
这题和这题一样......只不过多了个数... Finding LCM LightOJ - 1215 https://www.cnblogs.com/WTSRUVF/p/9316412.html #i ...
- LightOj 1215 - Finding LCM(求LCM(x, y)=L中的 y )
题目链接:http://lightoj.com/volume_showproblem.php?problem=1215 题意:已知三个数a b c 的最小公倍数是 L ,现在告诉你 a b L 求最 ...
- LightOj 1215 Finding LCM
Discription LCM is an abbreviation used for Least Common Multiple in Mathematics. We say LCM (a, b, ...
- LightOj 1236 - Pairs Forming LCM (分解素因子,LCM )
题目链接:http://lightoj.com/volume_showproblem.php?problem=1236 题意:给你一个数n,求有多少对(i, j)满足 LCM(i, j) = n, ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
- 1214 - Large Division -- LightOj(大数取余)
http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...
- LightOJ Beginners Problems 部分题解
相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...
- LightOJ 1341 唯一分解定理
Aladdin and the Flying Carpet Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld &a ...
随机推荐
- 简述AQS原理
这是一道面试题:简述AQS原理 AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态.如果被请求的共享资源被占用,那么就需要一套线程阻塞 ...
- YAML 基础
YAML 基础 简介 对象 数组 常量 引用 1. 简介 YAML 是专门用来写配置文件的语言,非常简洁和强大! 它的基本语法规则有: 大小写敏感: 使用缩进表示层级关系: 缩进时不允许使用 Tab ...
- Testing Harbor REST API on Swagger
先贴官方地址,我的做法差不多 https://github.com/goharbor/harbor/blob/master/docs/configure_swagger.md 1.下载对应资源 wge ...
- 亚马逊6月18日发布惊世之作 或为3D智能手机
亚马逊将在 6 月 18 日举行一个产品发布会. 其内容可能是关于传闻已久的亚马逊智能手机.该公司在 YouTube 上公布了一段炫耀这款设备的视频.这段视频展示了很多人在这款产品前摇头晃脑,并且表现 ...
- Coloring a Tree(耐心翻译+思维)
Description You are given a rooted tree with n vertices. The vertices are numbered from 1 to n, the ...
- 王者荣耀交流协会第四次Scrum立会
会议时间:2017年10月23号 18:00-18:28,时长28分钟. 会议地点:二食堂一楼第四个档口对着的靠路边的桌子. 立会内容: 1.小组成员汇报今日工作: 2.关于折线图与饼状图生成问题 ...
- Thunder团队——选题展示
团队名称:Thunder 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 项目名称:爱阅app 视频展示: http://www.cnblogs.com/lick468/p/76 ...
- 20162316刘诚昊 第八周实验报告:实验二 Java面向对象程序设计
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<L ...
- 阿帕奇web服务器下载部署安装运行
链接: https://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4 1.apache服务安装成功可是启动失败“wi ...
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...