题解:P12397 「FAOI-R9」函数大师
函数
可以先做一下变形。
若
由此可以看出符合条件的
因此,问题转化为每次询问有多少个
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long s(long long x){//求一个数在十进制下的各位数字之和
long long ans=0;
while(x) ans+=x%10,x/=10;
return ans;
}
long long S[200][5];
long long f[200];//由于 k 是固定的,所以只需要开一维
int T,k;
long long m;
int main(){
cin>>T>>k;
for(int i=1;i<=162;i++){//预处理
S[i][0]=i;
S[i][1]=s(S[i][0]);
S[i][2]=s(S[i][1]);
if(k<=3)
for(int j=0;j<k;j++) f[i]+=S[i][j];
else f[i]=S[i][0]+S[i][1]+S[i][2]+1ll*(k-3)*S[i][2];
}
while(T--){
cin>>m;
long long ans=0;
for(int i=1;i<=162;i++)//枚举 s(x)
if(s(m-f[i])==i) ans++;
cout<<ans<<'\n';
}
}