题意:牛牛最近迷恋上了数字。这次,他自定义了一个新的运算符图片说明 ,这个运算符的意思是通过操作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);
    }