P10496 The Luckiest Number

UPD:被叉了,原因是快速幂可能模数很大会爆 long long,改成 __int128 就好了。

考虑用一种比较方便表达的方式表示全是 \(8\) 的数字。我们发现,长度为 \(x\) 的全是 \(8\) 的数字可以表示为 \(\frac{10^x-1}{9}\times 8\)。

根据题目要求,这个数字是 \(L\) 的倍数,所以有下面式子:

\[L\mid\frac{10^x-1}{9}\times 8
\]

两边同时乘以 \(9\) 得到:

\[9L\mid8(10^x-1)
\]

这个式子可以继续化简,考虑到 \(\gcd(L,8)\) 一定整除 \(8(10^x-1)\),我们考虑在左边除以 \(\gcd(L,8)\),右边消去常数 \(8\):

\[\frac{9L}{\gcd(L,8)}\mid10^x-1
\]

由于没有什么关于这种式子的算法,所以我们改变式子的形式,把它变成同余式:

\[10^x-1\equiv 0\pmod {\frac{9L}{\gcd(L,8)}}
\]

移项得:

\[10^x\equiv 1\pmod {\frac{9L}{\gcd(L,8)}}
\]

转化为了高次不定方程,直接使用 exBSGS 解决。注意这题需要求出的是最小正整数解,所以 exBSGS 返回的答案必须大于 \(0\)。

#include <bits/stdc++.h>
using namespace std;
long long t,a,p,x,y,now=0;
map<long long,long long>h;
long long gcd(long long a,long long b)
{
if(b==0)return a;
else return gcd(b,a%b);
} long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
long long r=exgcd(b,a%b,x,y),d=x;
x=y,y=d-a/b*y;
return r;
} long long power(long long a,long long p,long long mod)
{
long long ans=1,x=a;
while(p)
{
if(p&1)ans=(__int128)ans*x%mod;
p>>=1;
x=(__int128)x*x%mod;
}
return ans;
} long long bsgs(long long a,long long b,long long mod)
{
h.clear();
long long t=sqrt(mod)+1,now=1,inc=power(a,t,mod);
if(a==0)
{
if(b==0)return 1;
else return -1;
}
for(int i=0;i<=t-1;i++)h[(__int128)now*b%mod]=i+1,now=(__int128)now*a%mod;
now=1;
for(int i=1;i<=t;i++)
{
now=(__int128)now*inc%mod;
if(h.count(now)>0&&((__int128)i*t-h[now]+1))return (__int128)i*t-h[now]+1;
}
return -1;
} long long exbsgs(long long a,long long b)
{
long long d=gcd(a,p),cnt=0,sum=1,ans=0;
a%=p,b%=p;
if(a==0)
{
if(b==0)return 1;
else return -1;
}
while(d!=1)
{
if(b%d!=0)return -1;
cnt++,p/=d,sum=(__int128)sum*(a/d)%p,b/=d;
d=gcd(a,p);
if(sum==b&&cnt!=0)return cnt;
}
exgcd(sum%p,p,x,y);
x=(x%p+p)%p;
ans=bsgs(a,(__int128)x*b%p,p);
if(ans==-1)return -1;
else return ans+cnt;
} int main()
{
while(1)
{
scanf("%lld",&a);
if(a==0)break;
p=9*a/gcd(a,8),now++;
long long ans=exbsgs(10,1);
if(ans==-1)printf("Case %lld: 0\n",now);
else printf("Case %lld: %lld\n",now,ans);
}
return 0;
}

Luogu P10496 The Luckiest Number 题解的更多相关文章

  1. poj 3696 The Luckiest Number

    The Luckiest Number 题目大意:给你一个int范围内的正整数n,求这样的最小的x,使得:连续的x个8可以被n整除. 注释:如果无解输出0.poj多组数据,第i组数据前面加上Case ...

  2. C#版 - Leetcode 414. Third Maximum Number题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  3. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  4. POJ3696 The Luckiest number

    题意 Language:Default The Luckiest number Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7 ...

  5. POJ_3696 The Luckiest number 【欧拉定理+同余式+对取模的理解】

    一.题目 Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his ...

  6. poj_3696_The Luckiest number

    Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...

  7. POJ3696:The Luckiest number(欧拉函数||求某数最小的满足题意的因子)

    Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...

  8. HDU 2462 The Luckiest number

    The Luckiest number Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Ori ...

  9. The Luckiest number(hdu2462)

    The Luckiest number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. [题解](同余)POJ_3696_The Luckiest Number

    还是挺难的吧......勉强看懂调了半天 首先表达式可以写成 8(10^x -1)/9,题意为求一个最小的x使L | 8(10^x -1)/9 设d=gcd(L,8) L | 8(10^x -1)/9 ...

随机推荐

  1. 格林威治时间(Tue Jan 01 00:00:00 CST 2019)转Date

    Excel导入时后台接受日期格式数据为[格林威治时间](例:Tue Jan 01 00:00:00 CST 2019) 格林威治时间转Date package com.cn; import java. ...

  2. C#之集合常用扩展方法与Linq

    一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...

  3. cocos3 Shader的CCProgram模板详解

    这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...

  4. Canvas、客户端、表单

    Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidt ...

  5. 【工具】you-get + ffmpeg|视频下载+音频提取

    一.原理: you-get下载,ffmpeg音视频分离. 这两个都是命令行工具. you-get安装(无python环境请参考python详细安装教程): pip3 install --upgrade ...

  6. FunProxy - 使用 Rust 构建跨平台全链路测试抓包代理工具

    作者:vivo 互联网大前端团队- Song Jiachao 在软件开发过程中,软件测试对于保障软件质量和用户满意度起着关键作用.为最大程度上提升软件品质,我们积极开展全链路测试实践,打造了用Rust ...

  7. kubeadm部署高可用master

    准备阶段 master1  master2  master3 node1 关闭selinux,firewall setenforce  0 sed -i 's/SELINUX=enforcing/SE ...

  8. 基于PySyft与TensorFlow的医疗数据协同分析系统实现教程

    1. 引言:医疗数据协同分析的挑战与机遇 在医疗信息化进程中,数据孤岛问题日益突出.各医疗机构积累的海量医疗数据受限于隐私法规(如HIPAA.GDPR)无法直接共享,形成数据壁垒.联邦学习技术的出现为 ...

  9. uni-app项目从0-1基础架构搭建全流程

    前情 最近新接了一个全新项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,UI库选择的是uview-plus,CSS引入现在流行的tainlwindcss,实现CSS原子化书写,实 ...

  10. 2、redis设置密码【永久性设置密码】

    1)编辑Redis的配置文件 /usr/local/etc/redis.conf 打开Finder,按 Command + Shift + G 快捷键打开"前往文件夹"对话框,在弹 ...