HDU 5936 Difference(思维+二分)——2016年中国大学生程序设计竞赛(杭州)

Posted ITAK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5936 Difference(思维+二分)——2016年中国大学生程序设计竞赛(杭州)相关的知识,希望对你有一定的参考价值。

传送门

Little Ruins is playing a number game, first he chooses two positive integers y and K and calculates f(y,K) , here

f(y,K)=z in every digits of yzK(f(233,2)=22+32+32=22)

then he gets the result

x=f(y,K)y

As Ruins is forgetful, a few seconds later, he only remembers K , x and forgets y . please help him find how many y satisfy x=f(y,K)y .  
Input First line contains an integer T , which indicates the number of test cases.

Every test case contains one line with two integers x, K .

Limits
1T100
0x109
1K9  
Output For every test case, you should output ’Case #x: y’, where x indicates the case number and counts from 1 and y is the result.  
Sample Input
  
   2
2 2
3 2
  

题目大意:

已知一个函数 f(y,k)y=x ,其中 f(y,k) 表示 y 的每一位的 k 次方的和,其中已知 x,k 求有多少个 y

解题思路:

因为有一个很重要的条件就是 x0,那么 y 不会很大,因为 k 最大为 9 ,所以当 y>1010 时, f(y,k)y0 ,那么就将 y 缩小到 [1,1010],然后我们发现这样数据范围还是很大,那么我们考虑枚举前 5 位数字,然后在二分 [1,105],这样复杂度就不是很高了,首先我们预处理 g[i][j]: i  j  。然后枚举前 5 位,将其乘以 105, 然后加上 [1,105] 之间的数看是否为答案,会发现我们将其 i[1,105] 区间中的 f(i,k)i 先存起来,然后二分求解就OK了。

trick:
用 map 记录超时了,所以直接 upper_boundlower_bound 就OK了

代码:

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
HDU-5936 Difference(折半枚举)

HDU - 5936: Difference(中途相遇法)

HDU 5936 Difference 中途相遇法(中国大学生程序设计竞赛(杭州))

HDU 5936 朋友

HDU7106 Function(思维+二分)

HDU7106 Function(思维+二分)