题目
样例输入
2
10 10
8 2
样例输出
Case #1: 46
Case #2: 13
思路: 一直没做出来,本来思路对的,结果预处理位置放错导致一直TLE,其实这道题是预处理,或者说打表,先将 1e6 内 2 ~ 10 进制的结果都算出来,大概 O(1e8) 左右,所以不会爆。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 1e6 + 5;
typedef long long ll;
ll res[11][M];
ll f(int n, int b)
{
ll ans = 0;
while (n)
{
ans += n % b;
n /= b;
}
return ans;
}
int main()
{
int t;
scanf("%d", &t);
for (int i = 2; i <= 10; ++i)
res[i][1] = 1;
for (int i = 2; i <= 10; ++i)
for (int j = 2; j <= 1000000; ++j)
res[i][j] = res[i][j - 1] + f(j, i);
for (int k = 1; k <= t; ++k)
{
int x, y;
scanf("%d %d", &x, &y);
printf("Case #%d: %lld\n", k, res[y][x]);
}
return 0;
}