poj3696.The Luckiest number (阶 && 欧拉函数 && 欧几里德)

原创 2015年11月17日 20:43:13
给定一个正整数 L ,问至少多少个 8 连在一起组成的正整数可以是 L 的倍数

N 个 8 组成的自然数是 (10 ^ N - 1) / 9 * 8。原题即为求最小的 N 满足 (10 ^ N - 1) / 9 * 8 = k * L。设 t = gcd(L, 8)。上式即为 8(10 ^ N - 1 ) /  t = 9kL。显然 8/t, 9L/t 都是整数,且 gcd(8/t, 9L/t)=1。所以 (9L/t) | (10 ^ N - 1)。也就是 10^N = 1(mod 9L/t)。也就是 10 关于 9L/t 的阶。于是 Nφ(9L/t)的约数。检查所有约数即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

const int MAX_N = 50000;

typedef long long LL;

LL n, d[MAX_N << 1], cnt = 0;
LL a;

int gcd(int x, int y)
{
	if(!y) return x;
	return gcd(y, x % y);
}

LL mult(LL a, LL b, LL p)
{
    LL ret = 0;
    while (b)
    {
        if (b & 1)
            ret = (ret + a) % p;
        a = 2 * a % p;
        b >>= 1;
    }
    return ret;
}

LL power(LL x, LL n, LL p)
{
    LL ret = 1;
    x %= p;
    while (n)
    {
        if (n & 1)
            ret = mult(ret, x, p);
        x = mult(x, x, p);
        n >>= 1;
    }
    return ret;
}

void doit()
{
	int g = gcd(8, n);
	a = (LL)(9 * (n / g)); 
	LL f = 1, t = a;   
    for(LL i = 2; i * i<= a; i ++){
        if (t % i == 0){        
            f *= (i-1); t /= i;
            while(t%i ==0){
                f *= i;    
                t /= i;
            }
        }
        if (t == 1) break;    
    }
    if (t > 1) f *= (t-1); //计算phi
	 
	for (LL i = 1; i * i <= f; i ++){
		if (f % i == 0) d[++ cnt] = i, d[++ cnt] = f / i;
	}
	sort(d + 1, d + cnt + 1); // 计算phi的因子 
	
	bool ok = 0;
	for (int i = 1; i <= cnt; i ++){
		//printf("%lld ", power(10, d[i], a));
		if(power(10, d[i], a) == 1) { ok = 1; printf("%lld\n", d[i]); break; }
	}
	if (!ok) printf("0\n");
} 

int main()
{
	int tot = 0;
	while(scanf("%lld", &n) != EOF){
		if (n == 0) break;
		printf("Case %d: ", ++ tot);
		cnt = 0;
		doit();
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 3696 : The Luckiest number - 欧拉函数,快速幂[数论好题]

题意:Bob最喜欢的数字是8,他的幸运数字是能整除L的全8序列的最短长度。请找到Bob的幸运数字,若无则输出0例如:L=1,ans=1;L=2,ans=1;L=8,ans=1;L=11,ans=2.分...

POJ 3696 The Luckiest number(欧拉函数)

题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。 思路: 首先要把A转化一下,把A表示成,则(p是一个整数),令,那么就存在一个整数k...

POJ 3696 The Luckiest Number 欧拉函数

/* 《数论及应用》P164 */ #pragma warning(disable:4786) #pragma comment(linker, "/STACK:102400000,102400...

POJ 3696 The Luckiest number 欧拉函数 或 BSGS

原题见POJ 3696给一个数L,问至少几个8(如88,8888,88888)可以整数L。若不能,就输出-1.首先把连续的x个8表示成8+8⋅10+8⋅102+...+8⋅10x−1=8(10x−1)...

POJ 3696 The Luckiest Number 欧拉函数

是否存在n能整除的m使m各位都是8。m=89(10x−1)=kn m=\frac{8}{9}(10^x-1) = kn 8⋅10x−1gcd(8,n)=9⋅kngcd(8,n) 8\cdot\fra...

poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用

题意: 给一个L,求长度最小的全8数满足该数是L的倍数。 分析: 转化为求方程a^x==1modm。之后就是各种数学论证了。 代码: //poj 3696 //sep9 #include ...

POJ 3696 The Luckiest number(欧拉函数)

 题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。 思路: 代码: #include #include #include #include...

poj3696The Luckiest number【欧拉函数】

Language: Default The Luckiest number Time Limit: 1000MS   Memory Limit: 65536K ...

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门,  所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) 一、同余定理 简单粗暴的说就是:若 a-b ...

【hdu2462】【数论】【欧拉函数+欧拉定理+大数快速幂】The Luckiest number

The Luckiest numberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)