题目
对于小 A 而言,数位包含 1 ∼ 9 ,并且至少两个数位是 d ( 1 ≤ d ≤ 9 )的 十 进 制 正 整 数都是幸运数。 当 d = 3 时,显然 1234567890123 是小 A 的幸运数,但 987654321 因为数位 3 仅出现了一次而不是 幸运数,998244353 因为缺少数位 1 , 6 , 7 而不是幸运数。 现在小 A 有一个正整数 n ,并给出正整数 d 。他想找到正整数 k 使得二者的乘积 n · k 是幸运数。你能用计算机辅助他的计算吗?
输入格式
本 题 测 试 点 包 含 多 组 数 据。第一行,一个正整数 T ( 1 ≤ T ≤ 3 × 1e 5 ),表示数据组数。对于每组数据:一行,两个正整数 n, d ( 1 ≤ n ≤ 1e 8 , 1 ≤ d ≤ 9 )。
输出格式
对于每组数据:
输出一行,一个正整数 k ,满足 n · k 是幸运数。你需要保证 k ≤ 2 × 1e 10
样例
standard input
|
standard output
|
3
1 6
12345678 9
233 2
|
1234567896
404
9217006
|
提示
对于 n = 1,d = 6,可以取 k = 1234567896,有 n · k = 1234567896 为幸运数。
对于 n = 12345678 , d = 9 ,可以取 k = 404 ,有 n · k = 4987653912 为幸运数。对于 n = 233 , d = 2 ,可以取 k = 9217006 ,有 n · k = 2147562398 为幸运数。
题解
记 N = (1234567890 + d ) · 10 ⌈ log 10 n ⌉ ,则有⌊N /n⌋ ≤ 2 · 1e 9 · 1e ⌈ log 10 n ⌉ n ≤ 2 · 1e 10并且 ⌊N / n⌋*n的前 10 位与 N 相同,因此取 k = ⌊ N / n ⌋ 即可。单组数据时间复杂度 O (1) 或 O ( log n )
AC代码
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main() {
int t;
cin >> t;
while (t--)
{
ll n, d;
scanf("%lld %lld", &n, &d); //cin会超时
ll N = (1234567890 + d) * pow(10,ceil(log10(n+0.5))); //不加0.5时n=1会出问题
cout<< (N/n)+1 << endl;
}
}