then he gets the result
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 .
Every test case contains one line with two integers x , K .
Limits
1≤T≤100
0≤x≤109
1≤K≤9
//即求0 <= x <= 1e9时有多少个y满足x + y == f(y,k)
//1 <= k <= 9,f(y,k)min = f(y,1) < ..< f(y,i) < ... < f(y,k)max = f(y,9) f(y,k)关于k是递增函数
//y有1位时,可以知道y == f(y,1) < f(y,i) 此时x取0即可
//y有2位时,f(y,k)min < y < f(y,k)max,存在正整数x使得等式x + y == f(y,k)成立
//假设y有m位时不存在正整数x使等式成立,f(y,k)max < 10^(m - 1) <= y <= x + y
//即f(y,k)max <= m * 9^9 < 10 ^(m - 1)成立,m = 9时还不成立,m >= 10时不等式恒成立,不等式成立即y有10位时,不存在正整数x使得x + y == f(y,k)
//所以y最多有10位数字
//啊啊啊啊啊啊x==0的时候,y = 0也满足,要减掉1
#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
ll ak[10][10];//a的k次方
map<ll,ll> cnt[10];
void init_ak()
{
for (int i = 0; i < 10; i ++) {
for (int j = 1; j < 10; j ++) {
ak[i][j] = pow(i, j);
}
}
}
ll f(int y,int k)
{
ll sum = 0;
while (y) {
sum += ak[y % 10][k];
y /= 10;
}
return sum;
}
void init_y()
{
ll sum = 0;
for (int k = 1; k <= 9; k ++) {
for (int y = 0; y < 1e5; y ++) {
sum = f(y, k);
cnt[k][sum - y * 1e5] ++;
}
}
}
int main()
{
init_ak();
init_y();
int T;
cin >> T;
for (int t = 1; t <= T; t ++) {
int x,k;
scanf("%d%d",&x,&k);
ll ans = 0,key = 0;
for (int i = 0; i < 1e5; i ++) {
key = x - f(i,k) + i;//枚举y2
if(cnt[k].find(key) != cnt[k].end()) {ans += cnt[k][key];}
}
if(x == 0) ans --;
printf("Case #%d: %lld\n",t,ans);
}
return 0;
}