题意:牛牛最近迷恋上了数字。这次,他自定义了一个新的运算符
,这个运算符的意思是通过操作a,b这两个数字来得到一个新的结果,例如,x(12,34) = 1234。牛牛使用他的新运算符构造出了一个式子:
。
由于这些都是牛牛的突发奇想,他特别想知道这个式子是否有合理的可能性,所以他给出了一个范围:用来验证。由于运算量非常大,所以他想请你帮他写一个程序验证在该范围下,有多少对满足这个式子?
时间复杂度: 普通 ,最优
空间复杂度:
解题思路:
此题如果纯暴力去搜索的话,复杂度会达到 ,该代码很容易实现,但容易超时,故不是最优解。
换种思路思考,可以先打个表找个规律。根据样例和简单打表的规律可以发现,其实这个式子可以转化为
,进行移项约分后,可以得到
,所以可以推得答案为b解的个数 * a。
将上述想法,以代码的方式实现,如下:
long long getnum(long long x) { long long sum = 0, cnt = 9; while (x >= cnt) { cnt = cnt * 10 + 9; sum++; } return sum; } /** * 返回在该范围内,共有多少对数字满足该公式 * @param x int整型 * @param y int整型 * @return long长整型 */ long long solve(int x, int y) { // write code here return x * getnum(y); }
当然,我们既然知道了这个规律,可以继续进行优化,我们可以直接知道b解的个数
long long getnum(long long x) { if(x < (int)1e1 - 1) return 0; else if(x < (int)1e2 - 1) return 1; else if(x < (int)1e3 - 1) return 2; else if(x < (int)1e4 - 1) return 3; else if(x < (int)1e5 - 1) return 4; else if(x < (int)1e6 - 1) return 5; else if(x < (int)1e7 - 1) return 6; else if(x < (int)1e8 - 1) return 7; else if(x < (int)1e9 - 1) return 8; else if(x <= (int)1e9) return 9; } /** * 返回在该范围内,共有多少对数字满足该公式 * @param x int整型 * @param y int整型 * @return long长整型 */ long long solve(int x, int y) { // write code here return x * getnum(y); }