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

题目简介

  • 题意:对于任意十进制整数 XXX,定义 F[X]†F[X]^\daggerF[X] 表示其循环左移一位所得到的数。给定非负整数 NNN,求所有满足等式 X+F[X]=NX+F[X]=NX+F[X]=NXXX 的个数。
    †\dagger 循环左移:设 X=a0a1⋯amX=a_0a_1\cdots a_mX=a0a1am,则 F[X]=a1⋯ama0F[X]=a_1\cdots a_ma_0F[X]=a1ama0。若 XXX 为一位整数,则 F[X]=XF[X]=XF[X]=X;若 F[X]F[X]F[X] 包含前导零则忽略。
  • 数据范围:0≤N≤10180\le N\le 10^{18}0N1018

题解

XXX 是一个 LLL 位数,分别将 XXXF[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×10L1+a1×10L2++aL2×10+aL1F[X]=a1×10L1+a2×10L2++aL1×10+a0

X=a×10L−1+bX = a \times 10^{L-1} + bX=a×10L1+b,其中 aaa 为首位数字1–91–91–9bbb 为剩余 L−1L-1L1 位,则 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(10L1+1)+11b=N,移项得 b=N−a(10L−1+1)11b = \frac{N - a(10^{L-1} + 1)}{11}b=11Na(10L1+1)

只要满足 bbb 为整数,0≤b<10L−10 \le b < 10^{L-1}0b<10L1,就说明存在这样的 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值