专栏文章
P12397 「FAOI-R9」函数大师 题解
P12397题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mipfpzj0
- 此快照首次捕获于
- 2025/12/03 11:15 3 个月前
- 此快照最后确认于
- 2025/12/03 11:15 3 个月前
场切了。
Statement
我们定义:
- 为 在十进制下各个数位上的数之和,即 。
- 。
- 。
给定 , 次询问,每次给定 ,求 与 的图象的公共点个数。
数据范围:,,。
Analysis
根据 Subtask 提示,分几种情况考虑:
- 当 时:
- 由题意知 。
- 答案显然为 。
- 当 时:
- 由题意知 。
- 由于 可能很大,枚举 无法接受,故考虑枚举较小的 。
- 具体地,枚举 ,则 。
- 验证 是否成立即可。
- 当 时:
- 由题意知 。
- 类似地,枚举 ,记 ,则 。
- 验证 且 是否成立即可。
- 当 时:
- 由题意知 。
- 注意到,当 逐渐增大时, 减小极快。
- 实际上,对于任意 ,当 时, 都是相同的。
- 因此,枚举 ,记 ,,则 。
- 验证 , 且 是否成立即可。
复杂度是常数级的。
Code
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f;
int t, k;
int s(int x){
int ret = 0;
while (x > 0){
ret += x % 10;
x /= 10;
}
return ret;
}
void solve(){
int m;
cin >> m;
int cnt = 0;
if (k == 0){ //不要忘记 k=0 的情况
cout << 1 << endl;
return;
}
for (int a = 0;a <= 200;a++){
int b = s(a), c = s(b), d = s(c);
if (k == 1){
int x = m - a;
cnt += (s(x) == a);
}
else if (k == 2){
int x = m - a - b;
cnt += (s(x) == a && s(s(x)) == b);
}
else{
int x = m - a - b - c * (k - 2);
cnt += (s(x) == a && s(s(x)) == b && s(s(s(x))) == c);
}
}
cout << cnt << endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t >> k;
while (t--) solve();
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...