首页 > 代码库 > NOJ1203 最多约数问题 [搜索 数论]

NOJ1203 最多约数问题 [搜索 数论]

传送门

njczy2010
1203
Accepted
79MS
  1400K
2321Byte
G++
2015-01-25 13:14:25.0

最多约数问题

时间限制(普通/Java) : 20000 MS/ 30000 MS          运行内存限制 : 81920 KByte
总提交 : 431            测试通过 : 52 

题目描述

   正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x)。例如,1,2,5,10都是正整数10的约数,且div(10)=4。 对于给定的2个正整数a<=b,编程计算a与b之间约数个数最多的数。

输入

输入的第1行有两个正整数a和b。

输出

 

若找到的a和b之间约数个数最多的数是x,则输出div(x)。

 

样例输入

1 36

样例输出

9

 

题目来源

算法设计与实验题解

 

先转一发大仙的题解:

http://blog.csdn.net/u012968092/article/details/41975317

 

我的优化:稍微改了下搜索顺序,因为新增加一种素因子在大部分情况下,比新增加当前已有的一个素因子来的收益大~

 

  1 #include<iostream>  2 #include<cstring>  3 #include<cstdlib>  4 #include<cstdio>  5 #include<algorithm>  6 #include<cmath>  7 #include<queue>  8 #include<map>  9 #include<set> 10 #include<stack> 11 #include<string> 12  13 #define N 100005 14 #define M 105 15 #define mod 1000000007 16 //#define p 10000007 17 #define mod2 1000000000 18 #define ll long long 19 #define LL long long 20 #define eps 1e-6 21 #define inf 1000000 22 #define maxi(a,b) (a)>(b)? (a) : (b) 23 #define mini(a,b) (a)<(b)? (a) : (b) 24  25 using namespace std; 26  27 ll a,b; 28 ll ma; 29 int f[N]; 30 ll p[N]; 31 ll ccnt; 32  33 void ini1() 34 { 35     memset(f,0,sizeof(f)); 36     ll i,j; 37     ccnt=0; 38     f[0]=f[1]=1; 39     for(i=2;i<=N-5;i++){ 40         if(f[i]==1) continue; 41         for(j=2*i;j<=N-5;j+=i){ 42             f[j]=1; 43         } 44     } 45     for(i=2;i<=N-5;i++){ 46         if(f[i]==0){ 47             p[ccnt]=i;ccnt++; 48         } 49     } 50    // printf(" cnt=%d\n",cnt); 51 } 52  53 ll quickpow(ll x,ll n) 54 { 55     ll re=1; 56     while(n) 57     { 58         if( (n&1)!=0 ){ 59             re*=x; 60         } 61         n/=2; 62         x*=x; 63     } 64     return re; 65 } 66  67 void dfs(ll st,ll now,ll cnt) 68 { 69     ll i; 70     //printf(" st=%I64d p=%I64d now=%I64d cnt=%I64d ma=%I64d\n",st,p[st],now,cnt,ma); 71     if(now>b) return; 72     if(now>=a){ 73         ma=max(ma,cnt); 74     } 75     ll temp=log(b/now)/log(p[st]); 76     ll re=quickpow(2,temp); 77    // printf("  temp=%I64d re=%I64d ma=%I64d\n",temp,re,ma); 78     if(re*cnt<=ma) return; 79     if( now<a && (a-1)/now==b/now ) return; 80     ll c=0; 81     ll te=now; 82    // printf("   te=%I64d now=%I64d\n",te,now); 83     if(st>=ccnt) return; 84     for(i=0;;i++){ 85         if(te>b) break; 86        // printf("  nst=%I64d te=%I64d ncnt=%I64d\n",st+1,te,(c+1)*cnt); 87         dfs(st+1,te,(c+1)*cnt); 88         te*=p[st]; 89         c++; 90     } 91 } 92  93 void ini() 94 { 95     ma=0; 96 } 97  98 void solve() 99 {100     if(a>b) swap(a,b);101     if(b==1){102         ma=1;return;103     }104     ma=2;105     dfs(0,1,1);106 }107 108 void out()109 {110     //printf("%I64d\n",ma);111     cout<<ma<<endl;112 }113 114 int main()115 {116     ini1();117     //freopen("data.in","r",stdin);118     //freopen("data.out","w",stdout);119     //scanf("%d",&T);120     //for(int ccnt=1;ccnt<=T;ccnt++)121     //while(T--)122   //  while(scanf("%I64d%I64d",&a,&b)!=EOF)123     while(cin>>a>>b)124     {125         ini();126         solve();127         out();128     }129     return 0;130 }

 

 

 

 

njczy2010
1203
Time Limit Exceed at Test 5
  
2323Byte
G++
2015-01-25 13:17:03.0
 
       
njczy2010
1203
Wrong Answer at Test 5
  
2167Byte
G++
2015-01-25 12:58:23.0
njczy2010
1203
Wrong Answer at Test 5
  
2120Byte
G++
2015-01-25 12:52:13.0
njczy2010
1203
Wrong Answer at Test 5
  
2120Byte
G++
2015-01-25 12:49:17.0
njczy2010
1203
Wrong Answer at Test 5
  
2136Byte
G++
2015-01-25 12:44:20.0
njczy2010
1203
Wrong Answer at Test 5
  
2137Byte
G++
2015-01-25 12:43:30.0
njczy2010
1203
Wrong Answer at Test 5
  
2140Byte
G++
2015-01-25 12:42:43.0
njczy2010
1203
Wrong Answer at Test 5
  
2140Byte
G++
2015-01-25 12:39:31.0
njczy2010
1203
Runtime Error at Test 7 
(STACK_OVERFLOW)
  
2115Byte
G++
2015-01-25 12:38:30.0
njczy2010
1203
Accepted
947MS
  712K
2818Byte
G++
2015-01-23 22:26:01.0
njczy2010
1203
Time Limit Exceed at Test 3
  
2825Byte
G++
2015-01-23 22:25:01.0
njczy2010
1203
Accepted
970MS
  712K
2812Byte
G++
2015-01-23 21:20:34.0
njczy2010
1203
Compile Error
  
2844Byte
G++
2015-01-23 21:19:14.0
njczy2010
1203
Time Limit Exceed at Test 3
  
2173Byte
G++
2015-01-23 21:17:06.0
njczy2010
1203
Wrong Answer at Test 3
  
1830Byte
G++
2015-01-23 21:02:14.0
njczy2010
1203
Wrong Answer at Test 3
  
1806Byte
G++
2015-01-23 20:58:55.0
njczy2010
1203
Wrong Answer at Test 3
  
1804Byte
G++
2015-01-23 20:57:37.0
njczy2010
1203
Runtime Error at Test 3 
(ACCESS_VIOLATION)
  
1795Byte
G++
2015-01-23 20:57:00.0

NOJ1203 最多约数问题 [搜索 数论]