洛谷P10496[数论,同余,欧拉定理]
题解:
一个数字只由8组成那么就可以写成
8×10x−19 8 \times \frac{10^{x}-1}{9} 8×910x−1
目前我们有L
那么
L∣8×10x−19 L|8 \times \frac{10^{x}-1}{9} L∣8×910x−1
9L∣8×10x−1 9L|8 \times 10^{x}-1 9L∣8×10x−1
令d=gcd(8,L);
9Ld∣8d×10x−1 \frac{9L}{d}|\frac{8}{d} \times 10^{x}-1 d9L∣d8×10x−1
那么gcd(9L/d,8/d)=1,那么有
9Ld∣10x−1 \frac{9L}{d}| 10^{x}-1 d9L∣10x−1
这个式子写成同余的形式就是
10x≡1(mod 9Ld) 10^{x}\equiv 1 (mod\; \frac{9L}{d}) 10x≡1(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) ab≡abmodϕ(n)(modn)
引理:
若a与n互质,则满足
ax≡1mod(n) a^{x} \equiv 1 mod(n) ax≡1mod(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;
}
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)