时显然无解,直接特判掉这种情况。
然后考虑对多项式 的系数进行分类讨论:
1. 中存在某一个系数的值大于 。
此时必然有 ,因此无需讨论该情况。
2. 中系数的最大值为 。
此时注意到若 中存在 个系数为 ,则同样的必然有 。因此此时必然是 的最高次项的系数为 ,其余项的系数为 。
先考虑 的情况。此时 ,则当且仅当 时合法。
然后考虑 的情况。此时 ,先把 带入多项式中得到 ,因此必须有 。此时又因为 ,所以解得 。
然后再把 带入多项式中。此时得到 ,解这个高次方程即可。具体的:
- 若 ,则若 则方程有无穷解,否则无解。
- 否则(),因为增长是指数级别的所以直接暴力算方程是否存在解即可。
3. 中系数的最大值小于 。
此时发现多项式 可以被看作是一个 进制的数,因此直接把 表示成 进制的形式,然后判断是否合法即可。因此也可以证明该类情况最多存在一个合法的多项式 。
有一点 corner case,注意讨论的时候不要把答案算重。
namespace lowspeed_song {
inline void init() {
}
int a[N], b[N];
inline void sol() {
int t, a, b; cin >> t >> a >> b;
if (a > b) cout << 0 << '\n';
else {
if (t == 1 && a == 1 && b == 1) cout << "inf\n";
else {
int res = 0;
if (a > 1) {
if (t == 1) {
int tmp = b;
while (tmp % a == 0) tmp /= a;
if (tmp == 1 && a != b) ++res;
}
int tmp = b, pwr = 1, all = 0;
while (tmp) all += (tmp % a) * pwr, pwr *= t, tmp /= a;
if (all == a) ++res;
}
if (a == b) ++res;
cout << res << '\n';
}
}
}
} // namespace lowspeed_song
喜欢的话,留下你的评论吧~