POJ - 3696 同余

给定\(L\),求最小的\(x\)满足$ L|8\frac{10^x-1}{9} $

/*H E A D*/
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll euler(ll n){
    ll ans=n;
    for(ll i = 2; i*i <= n; i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}
ll fmp(ll a,ll b,ll m){
	ll ans=0;
	while(b){
		if(b&1) ans=(ans+a)%m;
		a=(a+a)%m;
		b>>=1;
	}
	return ans;
}
ll fpw(ll a,ll n,ll m){
	ll ans=1;
	while(n){
		if(n&1) ans=fmp(ans,a,m);
		a=fmp(a,a,m);
		n>>=1;
	}
	return ans;
}
int main(){
	ll L,kase=0;
	while(cin>>L){
		if(L==0) break;
		L=9ll*L/gcd(L,8);
		printf("Case %lld: ",++kase);
		if(gcd(10,L)!=1){
			println(0);
			continue;
		}
		ll p=euler(L);
		ll ans=p;
		for(ll i=1; i*i<=p; i++){
			if(p%i!=0)continue;
			if(fpw(10,i,L)==1){
				ans=min(ans,i);
			}
			if(i*i!=p&&fpw(10,p/i,L)==1){
				ans=min(ans,p/i);
			}
		}
		println(ans);
	}
	return 0;
}
posted @ 2018-02-14 17:44  Caturra  阅读(151)  评论(0编辑  收藏  举报