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 }

时间: 2024-10-12 21:50:09

HDU5878的相关文章

hdu5878(枚举,打表)

题目链接:hdu5878 题意:到一行输入t,表示下面有t组数据,然后下面t行每行输入一个数n; 定义x==2^a*3^b*5^c*7^d(a, b, c, d为自然数,x不大于1e+9): 要求对于每一个n输出>=n的最小x: 思路:由于x比较大,可以先打个表: 依次枚举a,b,c,d将所有不大于1e+9的x存到数组a中,再用:lower_bound()找一下即可: 代码: #include<bits/stdc++.h>#define MAXN 10000#define MAX 100

hdu5878 I Count Two Three(二分+ 打表)

题目链接:hdu5878 I Count Two Three 题意:给出一个整数n, 找出一个大于等于n的最小整数m, 使得m可以表示为2^a * 3^b * 5^c * 7^d??. 题解:打表预处理出所有满足要求的数,排个序然后二分查找解决. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef long long ll; 5 const int N = 1e9; 6 ll s[100

HDU5878(打表)

I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 348    Accepted Submission(s): 184 Problem Description I will show you the most popular board game in the Shanghai Ingress Resis

2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分

I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 782    Accepted Submission(s): 406 Problem Description I will show you the most popular board game in the Shanghai Ingress Resis

2016 ACM/ICPC Asia Regional Qingdao Online HDU5878

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 解法:先保存,再二分查询~具体http://blog.csdn.net/coder_xia/article/details/6707600 #include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #inclu