首页 > 代码库 > 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
总提交 : 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 最多约数问题 [搜索 数论]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。