2014 吉林省赛题解 | CCUT应用OJ题解——F[X] + X = N
题目简介
- 题意:对于任意十进制整数 XXX,定义 F[X]†F[X]^\daggerF[X]† 表示其循环左移一位所得到的数。给定非负整数 NNN,求所有满足等式 X+F[X]=NX+F[X]=NX+F[X]=N 的 XXX 的个数。
†\dagger† 循环左移:设 X=a0a1⋯amX=a_0a_1\cdots a_mX=a0a1⋯am,则 F[X]=a1⋯ama0F[X]=a_1\cdots a_ma_0F[X]=a1⋯ama0。若 XXX 为一位整数,则 F[X]=XF[X]=XF[X]=X;若 F[X]F[X]F[X] 包含前导零则忽略。 - 数据范围:0≤N≤10180\le N\le 10^{18}0≤N≤1018
题解
设 XXX 是一个 LLL 位数,分别将 XXX 与 F[X]F[X]F[X] 进行位权展开:X=a0×10L−1+a1×10L−2+⋯+aL−2×10+aL−1;F[X]=a1×10L−1+a2×10L−2+⋯+aL−1×10+a0X = a_0 \times 10^{L-1} + a_1 \times 10^{L-2} + \cdots + a_{L-2} \times 10 + a_{L-1};F[X] = a_1 \times 10^{L-1} + a_2 \times 10^{L-2} + \cdots + a_{L-1} \times 10 + a_0X=a0×10L−1+a1×10L−2+⋯+aL−2×10+aL−1;F[X]=a1×10L−1+a2×10L−2+⋯+aL−1×10+a0。
记 X=a×10L−1+bX = a \times 10^{L-1} + bX=a×10L−1+b,其中 aaa 为首位数字1–91–91–9,bbb 为剩余 L−1L-1L−1 位,则 F[X]=b×10+aF[X] = b \times 10 + aF[X]=b×10+a,代入题中得:X+F[X]=a(10L−1+1)+11b=NX+F[X]=a(10^{L-1} + 1) + 11b=NX+F[X]=a(10L−1+1)+11b=N,移项得 b=N−a(10L−1+1)11b = \frac{N - a(10^{L-1} + 1)}{11}b=11N−a(10L−1+1)。
只要满足 bbb 为整数,0≤b<10L−10 \le b < 10^{L-1}0≤b<10L−1,就说明存在这样的 X。
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int main(){ios::sync_with_stdio(0),cin.tie(0);int T;while (cin >> T) {while(T--){long long N; cin >> N;long long ans = 0;for(int L=1; L<=19; ++L){long long poww = powl(10,L-1);int st = L==1? 0 : 1;for(int a=st; a<=9; a++){long long rem = N - a * (poww + 1);long long r = rem / 11;if (!(rem % 11)&&r >= 0 && r < poww) ans++;}}cout << ans << '\n';}}return 0;
}
