- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 43609
- 在线时间
- 小时
|
发表于 2018-11-23 21:21:57
|
显示全部楼层
- #include <stdio.h>
- #include <set>
- using namespace std;
- int gcd(int a, int b)
- {
- if(a==0)return b;
- return gcd(b%a, a);
- }
- int lcm(int a, int b)
- {
- return (a/gcd(a,b))*b;
- }
- #define MAX_ORDER 12
- set<int> even[MAX_ORDER+1];
- set<int> odd[MAX_ORDER+1];
- void calset()
- {
- int i,j;
- set<int>::iterator it;
- even[1].insert(1);//order 1 reached for even perm (1)
- even[2].insert(1);//order 1 reached for even perm (1)(2)
- odd[2].insert(2);//order 2 reach for odd (12)
- for(i=3;i<=MAX_ORDER;i++){
- if(i&1){
- even[i].insert(i);
- }else{
- odd[i].insert(i);
- }
- for(j=i-1;j>=2;j--){
- //use number j
- if(j&1){
- //use even perm with j numbers
- for(it=even[i-j].begin();it!=even[i-j].end();++it){
- even[i].insert(lcm(*it,j));
- }
- for(it=odd[i-j].begin();it!=odd[i-j].end();++it){
- odd[i].insert(lcm(*it,j));
- }
- }else{
- //use odd perm with j numbers
- for(it=even[i-j].begin();it!=even[i-j].end();++it){
- odd[i].insert(lcm(*it,j));
- }
- for(it=odd[i-j].begin();it!=odd[i-j].end();++it){
- even[i].insert(lcm(*it,j));
- }
- }
- }
- }
- }
- void find_max_8_12()
- {
- set<int>::iterator it1,it2;
- int maxorder=0;
- calset();
- for(it1=even[8].begin();it1!=even[8].end();++it1){
- for(it2=even[12].begin();it2!=even[12].end();++it2){
- int r=lcm(*it1,*it2);
- if(r>=maxorder){
- maxorder=r;
- printf("find order %d, even8=%d, even12=%d\n",maxorder, *it1, *it2);
- }
- }
- }
- for(it1=odd[8].begin();it1!=odd[8].end();++it1){
- for(it2=odd[12].begin();it2!=odd[12].end();++it2){
- int r=lcm(*it1,*it2);
- if(r>=maxorder){
- maxorder=r;
- printf("find order %d, odd8=%d, odd12=%d\n", maxorder, *it1, *it2);
- }
- }
- }
- printf("max order is %d\n",maxorder);
- }
- int main()
- {
- find_max_8_12();
- return 0;
- }
复制代码 |
|