(UVA
来源:互联网 发布:java linklist方法 编辑:程序博客网 时间:2024/06/06 01:01
链接:https://vjudge.net/problem/UVA-10892
Time limit3000 msOSLinux
题意:输入正整数n(n≤2∗109),统计有多少对正整数a≤b,满足lcm(a,b)=n.输出n和形成的对数.
分析:n的因子不是很多,可以把所有因子求出来,暴力求解
#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <sstream>#include <vector>#include <string>#include <set>#include <map>using namespace std;#define mem(a,n) memset(a,n,sizeof(a))#define pb(x) push_back(x)typedef long long LL;const int mod=1e6;const double eps=1e-6;const int INF=0x3f3f3f3f;const int N=205;vector<int>vec;int gcd(int a,int b){ return b?gcd(b,a%b):a;}int lcm(int a,int b){ return a/gcd(a,b)*b;}int main(){ ios::sync_with_stdio(false); int n,cas=1; while(cin>>n,n) { vec.clear(); for(int i=1; i*i<=n; i++) { if(n%i==0) { vec.pb(i); if(n/i!=i) vec.pb(n/i); } } int cnt=vec.size(),ans=0; sort(vec.begin(),vec.end()); int tmp; for(int i=0; i<cnt; i++) { for(int j=i; j<cnt; j++) { tmp=lcm(vec[i],vec[j]); if(tmp==n) ans++; //printf("ans=%d\n",ans); } } cout<<n<<" "<<ans<<endl; } return 0;}
也可以把n写成唯一分解式,利用分解的因子来求
可参考:http://blog.csdn.net/The_useless/article/details/53817026
http://blog.csdn.net/synapse7/article/details/11380309
若将数拆分成唯一分解式,可以发现
- 设a=pk11∗pk22∗…∗pknnb=pk′11∗pk′22∗…∗pk′nn
则有gcd(a,b)=pmin(k1,k′1)1∗pmin(k2,k′2)2∗…∗pmin(kn,k′n)nlcm(a,b)=pmax(k1,k′1)1∗pmax(k2,k′2)2∗…∗pmax(kn,k′n)n
那么显然,对于a和b而言,对于n中存在的某一质因数pi则有max(ka,kb)=kn. 所以
当ka=kn时,0≤kb<kn,
共计kn 当kb=kn时,0≤ka<kn,
共计kn
则总共为kn∗2+1(+1的原因是还有ka=kb=kn) 当然最后的答案为ans/2+1(只取a≤b情况)
#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <sstream>#include <vector>#include <string>#include <set>#include <map>using namespace std;#define mem(a,n) memset(a,n,sizeof(a))#define pb(x) push_back(x)typedef long long LL;const int mod=1e6;const double eps=1e-6;const int INF=0x3f3f3f3f;const int N=205;vector<int>vec;int main(){ ios::sync_with_stdio(false); int n,cas=1; while(cin>>n,n) { vec.clear(); int ans=1,tmp=n; for(int i=2; i*i<=n; i++) { if(n%i==0) { int cnt=0; vec.pb(i); while(n%i==0) cnt++,n/=i; ans*=(cnt*2+1); } } if(n>1) ans*=3; ans=ans/2+1; cout<<tmp<<" "<<ans<<endl; } return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- Linux内核笔记--深入理解文件描述符
- 你真应该再多了解些Handler机制
- jQuery 扩展实现
- Leetcode 从易入难 485.Max Consecutive Ones
- unity内存优化总结
- (UVA
- 【浅析】Python的内存管理机制
- UNIX环境高级编程习题——第六章
- Java并发编程:Callable、Future和FutureTask
- 常用正则表达式
- 算法复杂度分析符号θ
- C#中委托的理解
- Intellij IDEA svn的使用记录
- 【PHP基础知识】——PHP数组操作详解