1. 程式人生 > >POJ - 3696 同余

POJ - 3696 同余

n) cas log int main for 同余 pan c++

給定\(L\),求最小的\(x\)滿足\(L|8(10^x-1)\)

/*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; }

POJ - 3696 同余