zoukankan      html  css  js  c++  java
  • 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; 
    }
  • 相关阅读:
    小程序开发学习
    guava 学习一 函数,集合操作
    《构建之法》第四章 两人合作 读后感
    模拟退火学习笔记
    Haywire
    [JSOI2004]平衡点
    CF1039D You Are Given a Tree
    CF797E Array Queries
    [SHOI2014]三叉神经树
    [国家集训队]Tree II
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10237709.html
Copyright © 2011-2022 走看看