解析
题意可以化为:
8∗10x−19+kn=08*\frac{10^x-1}{9}+kn=08∗910x−1+kn=0
然后用 8 尽可能的消去 9n9n9n 中的2的幂次,随后问题转化为:
10x≡1(modn′)10^x\equiv 1\pmod {n'}10x≡1(modn′)
然后…我就觉得这个是exbsgs了…
但其实完全不用阿!
这个东西就是求 101010 在模 n′n'n′ 意义下的阶。
首先,无解的充要条件是 gcd(10,n′)>1\gcd(10,n')>1gcd(10,n′)>1。
否则,答案必然是 φ(n′)\varphi(n')φ(n′) 的因数,因为 10φ(n′)≡1(modn′)10^{\varphi(n')}\equiv 1\pmod {n'}10φ(n′)≡1(modn′)。
暴力检验即可。
注意会爆 long long
代码
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define OK debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}const int N=1e7+100;
const int mod=998244353;inline ll ksm(ll x,ll k,ll mod){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}int n,m;int prime[N/10],tot;
bool vis[N];
void init(){int n=1e7;for(int i=2;i<=n;i++){if(!vis[i]){prime[++tot]=i;}for(int j=1;j<=tot&&prime[j]<=n/i;j++){int now=prime[j];vis[now*i]=1;if(i%now==0){break;}}} return;
}ll calc(ll n){ll res=n,x=n;for(int i=2;1ll*i*i<=n;i++){if(x%i) continue;res=1ll*res/i*(i-1);while(x%i==0) x/=i;}if(x>1) res=1ll*res/x*(x-1);return res;
}inline ll gcd(ll x,ll y){return y?gcd(y,x%y):x;
}
ll find(ll phi,ll mod){if(gcd(10,mod)>1) return 0;ll ans=2e18;for(ll i=1;i*i<=phi;i++){if(phi%i) continue;if(ksm(10,i,mod)==1) ans=min(ans,i);if(ksm(10,phi/i,mod)==1) ans=min(ans,phi/i);}return ans;
}signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifint clo(0);while(1){ll n=read()*9;if(!n) break;for(int i=1;i<=3&&n%2==0;i++) n>>=1;ll phi=calc(n);printf("Case %d: %lld\n",++clo,(long long)find(phi,n));}return 0;
}
/*
*/