Luogu P10496 The Luckiest Number 题解
UPD:被叉了,原因是快速幂可能模数很大会爆 long long,改成 __int128 就好了。
考虑用一种比较方便表达的方式表示全是 \(8\) 的数字。我们发现,长度为 \(x\) 的全是 \(8\) 的数字可以表示为 \(\frac{10^x-1}{9}\times 8\)。
根据题目要求,这个数字是 \(L\) 的倍数,所以有下面式子:
\]
两边同时乘以 \(9\) 得到:
\]
这个式子可以继续化简,考虑到 \(\gcd(L,8)\) 一定整除 \(8(10^x-1)\),我们考虑在左边除以 \(\gcd(L,8)\),右边消去常数 \(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 题解的更多相关文章
- poj 3696 The Luckiest Number
The Luckiest Number 题目大意:给你一个int范围内的正整数n,求这样的最小的x,使得:连续的x个8可以被n整除. 注释:如果无解输出0.poj多组数据,第i组数据前面加上Case ...
- C#版 - Leetcode 414. Third Maximum Number题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- POJ3696 The Luckiest number
题意 Language:Default The Luckiest number Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7 ...
- POJ_3696 The Luckiest number 【欧拉定理+同余式+对取模的理解】
一.题目 Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his ...
- poj_3696_The Luckiest number
Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...
- POJ3696:The Luckiest number(欧拉函数||求某数最小的满足题意的因子)
Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...
- HDU 2462 The Luckiest number
The Luckiest number Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Ori ...
- The Luckiest number(hdu2462)
The Luckiest number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- [题解](同余)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 ...
随机推荐
- 格林威治时间(Tue Jan 01 00:00:00 CST 2019)转Date
Excel导入时后台接受日期格式数据为[格林威治时间](例:Tue Jan 01 00:00:00 CST 2019) 格林威治时间转Date package com.cn; import java. ...
- C#之集合常用扩展方法与Linq
一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...
- cocos3 Shader的CCProgram模板详解
这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...
- Canvas、客户端、表单
Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidt ...
- 【工具】you-get + ffmpeg|视频下载+音频提取
一.原理: you-get下载,ffmpeg音视频分离. 这两个都是命令行工具. you-get安装(无python环境请参考python详细安装教程): pip3 install --upgrade ...
- FunProxy - 使用 Rust 构建跨平台全链路测试抓包代理工具
作者:vivo 互联网大前端团队- Song Jiachao 在软件开发过程中,软件测试对于保障软件质量和用户满意度起着关键作用.为最大程度上提升软件品质,我们积极开展全链路测试实践,打造了用Rust ...
- kubeadm部署高可用master
准备阶段 master1 master2 master3 node1 关闭selinux,firewall setenforce 0 sed -i 's/SELINUX=enforcing/SE ...
- 基于PySyft与TensorFlow的医疗数据协同分析系统实现教程
1. 引言:医疗数据协同分析的挑战与机遇 在医疗信息化进程中,数据孤岛问题日益突出.各医疗机构积累的海量医疗数据受限于隐私法规(如HIPAA.GDPR)无法直接共享,形成数据壁垒.联邦学习技术的出现为 ...
- uni-app项目从0-1基础架构搭建全流程
前情 最近新接了一个全新项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,UI库选择的是uview-plus,CSS引入现在流行的tainlwindcss,实现CSS原子化书写,实 ...
- 2、redis设置密码【永久性设置密码】
1)编辑Redis的配置文件 /usr/local/etc/redis.conf 打开Finder,按 Command + Shift + G 快捷键打开"前往文件夹"对话框,在弹 ...