Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js

[HDU2462] The Luckiest number

前言

update 2021.7.23 加上了句号,但是丑陋的 LATEXLATEX 使用没有改。

差一点就推出来了qaq。

题目

HDU

题目大意:

多组询问,0结束,问x=88...888x=88...888(len个88),且L|xL|x的最小lenlen,如果无解输出00

输出格式见样例。

讲解

首先我们可以将xx表示为(10len1)/98(10len1)/98

那么L|(10len1)/98L|(10len1)/98L9|(10len1)8L9|(10len1)8

d=gcd(L9,8)d=gcd(L9,8),所以L9/d|(10len1)8/dL9/d|(10len1)8/d

L=L9/d,因为L9/d8/d互质,所以L|(10len1)

那么一定可以写成这种形式:10len%L=1

此时如果10L不互质,一定无解。

否则10ϕ(L)%L=1ϕ(L)即为答案。

吗?

我们要求最小的答案,所以我们需要枚举ϕ(L)的因数,再用快速幂判断即可。

值得注意的是在快速幂期间,中间变量可能会爆long long,所以要使用防爆乘法。

代码

LL gcd(LL x,LL y)
{
	if(!y) return x;
	return gcd(y,x%y);
}
LL getphi(LL x)
{
	LL ret = x;
	for(int i = 2;1ll * i * i <= x;++ i)
	{
		if(x % i == 0)
		{
			ret = ret / i * (i-1);
			while(x % i == 0) x /= i;
		}
	}
	if(x > 1) ret = ret / x * (x-1);
	return ret;
}
LL gsc(LL x,LL y,LL MOD)
{
	LL ret = 0;
	while(y){if(y & 1) ret = (ret + x) % MOD;x = (x << 1) % MOD;y >>= 1;}
	return ret;
}
LL qpow(LL x,LL y,LL MOD)
{
	LL ret = 1;
	while(y){if(y & 1) ret = gsc(ret,x,MOD);x = gsc(x,x,MOD);y >>= 1;}
	return ret;
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	while(1)
	{
		n = Read();
		if(!n) return 0;
		n *= 9;
		LL d = gcd(n,8),ans,phi;
		n /= d;
		if(gcd(n,10) > 1) {printf("Case %d: 0\n",++tot);continue;}
		ans = phi = getphi(n);
		for(int i = 1;1ll*i*i <= phi;++ i)
			if(phi % i == 0)
			{
				if(qpow(10,i,n) == 1) {ans = i;break;}
				if(qpow(10,phi/i,n) == 1) ans = phi/i;
			}
		printf("Case %d: %lld\n",++tot,ans);
	}
	return 0;
}
posted @   皮皮刘  阅读(144)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示