首页 > 代码库 > HDU5878
HDU5878
http://acm.hdu.edu.cn/showproblem.php?pid=5878
给出你一个数字,让你求出大于这个数字n并且是形如2^a*3^b*5^c*7^d的最小的数;
就是用打表法求出所有的数,然后通过二分来查找,否则就会超时
有一点是童鞋们需要注意的,就是在文件中自定义函数的pow返回值是double型的,在这里我们需要用的返回值是int型的,要不然就会因为系统内部的精度问而出错
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<math.h> 6 using namespace std; 7 long long int ll=1e9; 8 long long int ss[500005]; 9 10 long long int pow(long long int a, long long int b)11 {12 long long int ans = 1;13 while(b)14 {15 if(b & 1)ans *= a;16 a *= a;17 b>>=1;18 }19 return ans;20 }21 22 int main()23 {24 int t;25 long long int ch;26 cin>>t;27 while(t--){28 int p=0;29 int n;30 for(long long int i=0;i<31;i++)31 for(long long int j=0;j<20;j++)32 for(long long int k=0;k<14;k++)33 for(long long int l=0;l<12;l++){34 ch=pow(2,i)*pow(3,j);35 if(ch>ll)break;36 ch*=pow(5,k);37 if(ch>ll)break;38 ch*=pow(7,l);39 if(ch>ll)break;40 ss[p++]=ch;41 }42 sort(ss,ss+p);43 cin>>n;44 int l=0;45 int r=p-1;46 while(l<r){47 int mid=l+(r-l)/2;48 if(ss[mid]>=n){49 r=mid;50 }51 else l=mid+1;52 }53 cout<<ss[l]<<endl;54 55 }56 }
HDU5878
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。