2014 吉林省赛题解 | CCUT应用OJ题解——F[X] + X = N

题目简介

  • 题意:对于任意十进制整数 \(X\),定义 \(F[X]^\dagger\) 表示其循环左移一位所得到的数。给定非负整数 \(N\),求所有满足等式 \(X+F[X]=N\)\(X\) 的个数。
    \(\dagger\) 循环左移:设 \(X=a_0a_1\cdots a_m\),则 \(F[X]=a_1\cdots a_ma_0\)。若 \(X\) 为一位整数,则 \(F[X]=X\);若 \(F[X]\) 包含前导零则忽略。
  • 数据范围:\(0\le N\le 10^{18}\)

题解

\(X\) 是一个 \(L\) 位数,分别将 \(X\)\(F[X]\) 进行位权展开:\(X = 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_0\)

\(X = a \times 10^{L-1} + b\),其中 \(a\) 为首位数字\(1–9\)\(b\) 为剩余 \(L-1\) 位,则 \(F[X] = b \times 10 + a\),代入题中得:\(X+F[X]=a(10^{L-1} + 1) + 11b=N\),移项得 \(b = \frac{N - a(10^{L-1} + 1)}{11}\)

只要满足 \(b\) 为整数,\(0 \le b < 10^{L-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;
}
posted @ 2025-11-12 22:03  椰萝Yerosius  阅读(7)  评论(0)    收藏  举报