【POJ 3696】 The Luckiest number

【题目链接】

            http://poj.org/problem?id=3696

【算法】

           设需要x个8

           那么,这个数可以表示为 : 8(10^x - 1) / 9, 由题, L | 8(10^x - 1) / 9

           令d = gcd(L,8),则 :

           L | 8(10^x - 1) / 9

           9L | 8 (10^x - 1)  ->  9L/d | 10^x-1 -> 10^x(mod (9L/d)) = 1

          易证a^x(mod n) = 1的最小正整数解是phi(n)的一个约数

          那么,求出欧拉函数phi(9L/d),枚举约数,即可

【代码】

            

#include <algorithm>  
#include <bitset>  
#include <cctype>  
#include <cerrno>  
#include <clocale>  
#include <cmath>  
#include <complex>  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <ctime>  
#include <deque>  
#include <exception>  
#include <fstream>  
#include <functional>  
#include <limits>  
#include <list>  
#include <map>  
#include <iomanip>  
#include <ios>  
#include <iosfwd>  
#include <iostream>  
#include <istream>  
#include <ostream>  
#include <queue>  
#include <set>  
#include <sstream>  
#include <stdexcept>  
#include <streambuf>  
#include <string>  
#include <utility>  
#include <vector>  
#include <cwchar>  
#include <cwctype>  
#include <stack>  
#include <limits.h>
using namespace std;
typedef long long ll;

int i,cnt,TC;
ll factor[100010];
ll d,l,p;

inline ll gcd(ll x,ll y)
{
        if (y == 0) return x;
        else return gcd(y,x%y);        
}
inline ll phi(ll n)
{
        int i;
        ll ret = n;
        for (i = 2; i <= sqrt(n); i++)
        {
                if (n % i == 0)
                {
                        ret = ret / i * (i - 1);
                        while (n % i == 0) n /= i;
                }
        }        
        if (n > 1) ret = ret / n * (n - 1);
        return ret;
}
inline ll mul(ll a,ll b,ll p)
{
        ll ans = 0;
        while (b)
        {
                if (b & 1) ans = (ans + a) % p;
                a = a * 2 % p;
                b >>= 1;
        }
        return ans;
}
inline ll power(ll a,ll n)
{
        ll b = a,ret = 1;
        while (n > 0)
        {
                if (n & 1) ret = mul(ret,b,d);
                b = mul(b,b,d);
                n >>= 1;    
        }        
        return ret;
}

int main() 
{
        
        while (scanf("%lld",&l) != EOF && l)
        {
                d = 9 * l / gcd(8,l);
                printf("Case %d: ",++TC);
                if (gcd(10,d) != 1)
                {
                        printf("0
");
                        continue;        
                }    else
                {
                        cnt = 0;
                        p = phi(d);
                        for (i = 1; i <= sqrt(p); i++)
                        {
                                if (p % i == 0)
                                {
                                        factor[++cnt] = i;
                                        if (i * i != p) factor[++cnt] = p / i;
                                }
                        }
                        sort(factor+1,factor+cnt+1);for (i = 1; i <= cnt; i++)
                        {
                                if (power(10,factor[i]) == 1)
                                {
                                        printf("%lld
",factor[i]);
                                        break;
                                }
                        }
                }
        }
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9284531.html