poj3696 欧拉函数引用

不知道错在哪里,永远T

/*
引理:a,n互质,则满足a^x=1(mod n)的最小正整数x0是φ(n)的约数 
思路:求出d=gcd(L,8)
求出φ(9L/d)的约数集合,再枚举约数x,是否满足10^x = 1 (mod 9L/d)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long

ll l,d,phi,m,factor[1000000];
ll v[1000000],prime[1000000],mm; 
void init(ll n){
    memset(v,0,sizeof v);
    memset(prime, 0,sizeof prime);
    mm=0;
    for(int i=2;i<=n;i++){
        if(v[i]==0){
            v[i]=i;
            prime[++mm]=i;
        }
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i] || prime[j]*i>n) break;
            v[i*prime[j]]=prime[j];
        }
    }
}

ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll f(ll n){
    ll res=n;//和1互质 
    for(int i=1;i<=mm;i++){
        if(prime[i]>n) break;
        if(n%prime[i]==0) res=res/prime[i]*(prime[i]-1);
        while(n%prime[i]==0) 
            n/=prime[i];
    }
    if(n>1) res=res/n*(n-1);
    return res;
}
ll mul(ll a,ll b,ll m)
{
    ll res=0;
    while(b)
    {
        if(b&1) res+=a;
        if(res>m) res-=m;
        a+=a;
        if(a>m)
        a-=m;
        b>>=1;
    }
    return res;
}
ll pow(ll a,ll b,ll m)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=mul(res,a,m);
        a=mul(a,a,m);
        b>>=1;
    }
    return res;
}

int main(){
    int tt=0;
    init(sqrt(2000000005));
    while(scanf("%lld",&l),l){
        d=gcd(l,8);
        phi=f(9*l/d);
        if(gcd(10,9*l/d)!=1) {
            printf("Case %d: 0
",++tt);
            continue;
        }
        m=0;
        for(int i=1;i*i<=phi;i++)
            if(phi%i==0){
                factor[++m]=i;
                if(i!=phi/i) factor[++m]=phi/i;
            }
        
        
        //从小到大枚举每个约数 
        ll mod=9*l/d,flag=0;
        sort(factor+1,factor+1+m);
        for(int i=1;i<=m;i++){
            if(pow(10,factor[i],mod)%mod==1){
                flag=1;
                printf("Case %d: %lld
",++tt,factor[i]);
                break;
            }    
        }
        if(flag==0) printf("Case %d: 0
",++tt);
    }
    return 0; 
}
原文地址:https://www.cnblogs.com/zsben991126/p/10237709.html