AOJ 739 First Blood
First Blood
Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 152 Submission Accepted: 37
Total Submission: 152 Submission Accepted: 37
Description
盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
Input
首先是一个正整数T,表示有T组测试数据
每组测试数据是一个正整数n(1<=n<=10^6)
每组测试数据是一个正整数n(1<=n<=10^6)
Output
对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行
Sample Input
2 9 7
Sample Output
504 210
Source
安徽省2015年“京胜杯”大学生程序设计竞赛
简单题解(方法一):
- 本题可用暴力搜索法解决
- 必须细心剪枝,否则会超时
1 #include<iostream> 2 using namespace std; 3 4 long long gcd(long long a,long long b) 5 { 6 if(b==0) 7 return a; 8 return gcd(b,a%b); 9 } 10 11 long long lcm(long long a,long long b) 12 { 13 return a/gcd(a,b)*b; 14 } 15 16 17 int main() 18 { 19 int t; 20 cin>>t; 21 while(t--) 22 { 23 long long n; 24 long long x,i,j,k,max=0; 25 cin>>n; 26 for(i=n;i>0;i--) 27 { 28 if(i*i*i<max) 29 break; 30 for(j=n;j>0;j--) 31 { 32 if(i*j*j<max) 33 break; 34 for(k=n;k>0;k--) 35 { 36 if(i*j*k<max) 37 break; 38 x=lcm(i,lcm(j,k)); 39 if(x>max) 40 max=x; 41 } 42 } 43 } 44 cout<<max<<endl; 45 } 46 return 0; 47 }
简单题解(方法二):
- 找规律
- 如果n为奇数,则结果是n*(n-1)*(n-2)
- 如果n为偶数,此时n与n-2不互质,则大部分情况的结果是n*(n-1)*(n-3),但是还有例外(n=6,12,18,24...等数时,n与n-3不是互质的)此时结果为(n-1)*(n-2)*(n-3)
- 还应注意n<3的情况
1 #include<iostream> 2 using namespace std; 3 4 long long gcd(long long a,long long b) 5 { 6 if(b==0) 7 return a; 8 return gcd(b,a%b); 9 } 10 11 bool isrp(long long m,long long n) 12 { 13 if(gcd(m,n)>1) 14 return 0; 15 else return 1; 16 } 17 18 long long lcm(long long a) 19 { 20 if(a%2==0) 21 { 22 if(!isrp(a,a-3)) 23 return lcm(a-1); 24 else 25 return a*(a-1)*(a-3); 26 } 27 else 28 return a*(a-1)*(a-2); 29 } 30 31 int main() 32 { 33 int t; 34 cin>>t; 35 while(t--) 36 { 37 long long n; 38 cin>>n; 39 if(n==1) 40 cout<<1<<endl; 41 else if(n==2) 42 cout<<2<<endl; 43 else 44 cout<<lcm(n)<<endl; 45 } 46 return 0; 47 }