数学 2015百度之星初赛2 HDOJ 5255 魔法因子

题目传送门

 1 /*
 2     数学:不会写,学习一下这种解题方式:)
 3     思路:设符合条件的数的最高位是h,最低位是l,中间不变的部分为mid,由题意可得到下面的公式(这里对X乘上1e6用a表示,b表示1e6)
 4         (h*power+l+mid)*a = (l*power+h+mid)*b
 5         可推得:mid = ((h*power+l) * a - (l*power+h) * b) / (a - b);
 6         所以可以枚举h,l然后求mid,注意mid的最低位一定是0,因为留出最低位加l或者h
 7     详细解释:http://blog.csdn.net/u010660276/article/details/46290703
 8 */
 9 #include <cstdio>
10 #include <algorithm>
11 #include <cstring>
12 #include <cmath>
13 #include <vector>
14 using namespace std;
15
16 typedef long long ll;
17 const int MAXN = 1e4 + 10;
18 const int INF = 0x3f3f3f3f;
19 vector<ll> V;
20
21 int main(void)        //2015百度之星初赛2 HDOJ 5255 魔法因子
22 {
23     int t, cas = 0;    scanf ("%d", &t);
24     while (t--)
25     {
26         V.clear ();
27         double x;    scanf ("%lf", &x);
28         ll a = (ll) (x * 1e6 + 0.1);    ll b = 1e6;
29
30         for (int k=2; k<=10; ++k)
31         {
32             ll p = 1;    for (int i=1; i<k; ++i)    p *= 10;
33             for (int r=1; r<=9; ++r)
34             {
35                 for (int l=0; l<=9; ++l)
36                 {
37                     ll tmp = (l * p + r) * b - (r * p + l) * a;
38                     if (tmp % (10 * (a - b)) == 0)
39                     {
40                         ll mid = tmp / 10 / (a - b);    ll tmp_mid = mid;
41                         if (tmp_mid < 0)    continue;
42                         int cnt = 0;    while (tmp_mid)    {++cnt;    tmp_mid /= 10;}
43                         if (cnt <= k - 2)    V.push_back (r * p + mid * 10 + l);
44                     }
45                 }
46             }
47         }
48
49         printf ("Case #%d:\n", ++cas);
50         printf ("%d\n", V.size ());
51         for (int i=0; i<V.size (); ++i)
52         {
53             printf ("%I64d%c", V[i], (i == V.size ()-1) ? ‘\n‘ : ‘ ‘);
54         }
55     }
56
57     return 0;
58 }
59
60
61 /*
62 3
63 3.1312
64 3.1215
65 0.3
66 */
时间: 2024-12-26 02:18:06

数学 2015百度之星初赛2 HDOJ 5255 魔法因子的相关文章

LIS 2015百度之星初赛2 HDOJ 5256 序列变换

题目传送门 1 /* 2 LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upp

BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领

题目传送门 1 /* 2 BFS:先把1的入队,每个1和它相邻的组合后看看能不能使0变1,若有则添加入队,change函数返回改变了多少个0 3 注意:结果还要加上原来占领的 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include <queue> 11

Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道

题目传送门 1 /* 2 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 3 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include &l

二分搜索 2015百度之星初赛1 1003 序列变换

题目传送门 1 /* 2 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 3 比赛时以为是贪心,榨干智商也想不出来:( 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <iostream> 10 using

二分查找 2015百度之星初赛1 1001 超级赛亚ACMer

题目传送门 1 /* 2 二分找到不大于m的最大的数,记做p,只要a[p] + k <= a[p+1]就继续 3 注意:特判一下当没有比m小的数的情况:) 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 11 typedef long long ll; 12 13 const

贪心/数学 2015百度之星资格赛 1004 放盘子

题目传送门 1 /* 2 贪心:小度熊先在多边形中间放一个盘子,接下来无论来访者怎么放,小度熊都根据多边形中心与来访者的盘子对称着放就能获胜. 3 题目已经给出方法,就是能否把盘子放在多边形中间,那么和边心距比较 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cmath> 8 #include <cstring> 9 using namespace std; 10 11 const i

2015百度之星初赛2 1004 魔法因子(暴力+数学)

Problem Description 有人说:人类是自己一步步进化的,而数学是上帝亲手创造的.度度熊最近也正沉醉于数学之美中,它发现了一种神奇的数字,取名曰:魔法因子. 将因子记为X,如果有一些整数与这些因子做乘法后,结果仍然是整数,同时,结果数字的首位和末位会换交换位置,而其他位置上的数字恰好不变!这时X被认为是一个魔法因子.需要注意的是,用来相乘的这些整数不会含有前导0,但是如果交换的结果有前导0,又恰好是乘法的结果,这时仍然认为X是这个整数的魔法因子.度度熊认为1不是个魔法因子,因为所有

2015百度之星初赛2 1005 序列变换(LIS变形)

LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upper_bound的位置插入

2015 百度之星初赛 1 2 2015ACM/ICPC亚洲区上海站 codeforces 851

A - 超级赛亚ACMer HDU - 5246 n m k m >=max( a[i] ); m < min(a[i]); 先判断掉 然后就可以找到最接近的 比m小的一个数 往上涨 看是否能行 O(n) #include<stdio.h> #include<string.h> #include<algorithm> #include<string> #include<iostream> #include<math.h>