题解:
一个数字只由8组成那么就可以写成
8×10x−19 8 \times \frac{10^{x}-1}{9} 8×910x1
目前我们有L

那么
L∣8×10x−19 L|8 \times \frac{10^{x}-1}{9} L∣8×910x1

9L∣8×10x−1 9L|8 \times 10^{x}-1 9L∣8×10x1

令d=gcd(8,L);
9Ld∣8d×10x−1 \frac{9L}{d}|\frac{8}{d} \times 10^{x}-1 d9Ld8×10x1
那么gcd(9L/d,8/d)=1,那么有
9Ld∣10x−1 \frac{9L}{d}| 10^{x}-1 d9L∣10x1
这个式子写成同余的形式就是
10x≡1(mod  9Ld) 10^{x}\equiv 1 (mod\; \frac{9L}{d}) 10x1(modd9L)
根据欧拉定理:

当a与n互质的时
aϕ(n)≡1(mod  n) a^{\phi (n)} \equiv 1 (mod \; n) aϕ(n)1(modn)
那么我们有推论1:

当a 与n互质
ab≡ab  mod  ϕ(n)(mod  n) a^b \equiv a^{b\; mod\;\phi(n)} (mod\;n) ababmodϕ(n)(modn)
引理:
若a与n互质,则满足
ax≡1mod(n) a^{x} \equiv 1 mod(n) ax1mod(n)
的最小正整数x_0是phi(n)的约数

显然,如果10和9L/d不互质,那么一定不会余1,无解;互质的话我们枚举一遍phi(9L/d)的约数即可,然后快速幂进行验证

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1005;
int num=0;
int phi(int n){
    int ans=n;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){
            ans=ans*(i-1)/i;
            while(n%i==0)n/=i;
        }
    }
    if(n>1)ans=ans*(n-1)/n;
    return ans;
}
int qmul(int a,int b,int mod){
    return (__int128)a*b%mod;
}
int qpow(int a,int b,int mod){
    int ans=1;
    for(;b;b>>=1){
        if(b&1)ans=qmul(ans,a,mod);
        a=qmul(a,a,mod);
    }
    return ans;
}
void solve(){
    int l;
    while(cin>>l&&l!=0){
        cout<<"Case "<<++num<<": ";
        int d=gcd(l,8);
        if(gcd(9*l/d,10)!=1){
            cout<<0<<'\n';
            
        }else {
            vector<int>res;
            int nums=phi(9*l/d);
            for(int i=1;i<=sqrt(nums);i++){
                if(nums%i==0){
                    res.push_back(i);
                    if(nums/i!=i){
                        res.push_back(nums/i);
                    }
                }
            }
            int ans=0;
            sort(res.begin(),res.end());
            for(auto x:res){
                if(qpow(10,x,9*l/d)==1){
                    ans=x;
                    break;
                }
            }
            cout<<ans<<'\n';
        }
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
    return 0;
}

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐