sdutoj 3275第七届校赛--LCM的个数
2016-05-27 19:08
239 查看
题目链接:点击打开链接
对于我们来说求两个数的LCM(最小公倍数)是很容易的事,现在我遇到了一个问题需要大家帮助我来解决这问题,问题是:给你一个数n,然后统计有多少对(a<=b) LCM(a,b)=n;例如LCM(a,b)=12; 即(1,12),(2,12),(3,12),(4,12),(6,12),(12,12),(3,4),(4,6);
输入数组有多组,每组数据包含一个整数n(n<=10^9);
输出每组数据的对数。
题目描述
对于我们来说求两个数的LCM(最小公倍数)是很容易的事,现在我遇到了一个问题需要大家帮助我来解决这问题,问题是:给你一个数n,然后统计有多少对(a<=b) LCM(a,b)=n;例如LCM(a,b)=12; 即(1,12),(2,12),(3,12),(4,12),(6,12),(12,12),(3,4),(4,6);
输入
输入数组有多组,每组数据包含一个整数n(n<=10^9);
输出
输出每组数据的对数。
示例输入
2 3 4 6
示例输出
2 2 3 5
思路:由于10的9次方太大,根据数值的特点将其缩小循环,对于n=a*b,其中一定有b>=a,所以~
<span style="font-size:18px;">///第七届校赛--LCM的个数 #include <iostream> #include<cstdio> #include<algorithm> using namespace std; long long f(long long x,long long y) { if(x<y) { long long t=x; x=y; y=t; } long long m=x,n=y; long long r; while(1) { r=x%y; if(r==0)break; x=y; y=r; } return (n*m)/y; } int main() { long long n; while(cin>>n) { long long a[200]; long long sum=0; long long top=0; for(long long i=1; i*i<=n; i++) { if(n%i==0) { a[top++]=i; sum++; if((n/i)!=i) { a[top++]=n/i; sum++; } } } sort(a,a+top); for(long long i=1; i<top-1; i++) { for(long long j=i; j<top-1; j++) { if(f(a[j],a[i])==n) { sum++; } } } cout<<sum<<endl; } return 0; } </span>
相关文章推荐
- Android GLSurfaceView.Renderer
- 小组分工
- 根据对象的某一属性进行排序的js代码(如:name,age)
- Java高级之虚拟机垃圾回收机制
- 编程命名规则:驼峰命名法和匈牙利命名法
- iOS下的实际网络连接状态检测
- hadoop 2.7.2使用maven编译安装
- spark读写hdfs后出现的异常错误
- Java高级之虚拟机垃圾回收机制
- 餐馆管理之点菜
- C# 不同访问符的访问级别
- CocoaPods 添加第三方库报错
- 解读断点续传的基本原理
- android NDK 环境搭建
- 让自己的java程序 内存占用情况”看得见“
- sdut oj 3266 ///山理工第七届校赛--最大收益问题
- hdu2073无限的路
- 第二次团队冲刺--1
- 《大话设计模式》读书笔记
- 关于Ubuntu 64位系统的32位兼容库问题