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. springmvc实现转发和重定向

    一. @RequestMapping("/testVoid") public String testVoid(HttpServletRequest request){ //转发方式 ...

  2. MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题

    MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题 问题背景 在停服发版更新时,需对 200GB 大表(约 200 亿行数据)进行快速备份以预防操作失误. 因为曾经出现过有开发写的发 ...

  3. infiniswap用到的技术

    infiniswap来自 NSDI'17,其代码主要用到以下技术: configfs(主要) configfs-用户空间控制的内核对象配置 https://www.kernel.org/doc/Doc ...

  4. blk_mq多队列块设备浅析

    1. 为什么要使用多队列 在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个队列: 在块设备层,来自多个cpu的bio请求被放在同 ...

  5. <HarmonyOS第一课02>DevEco Studio的使用

    视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717494752698457?ha_sou ...

  6. 【经验】Word 2021|Word文档间复制粘贴保留源格式后,行间距却发生变化(文档网格)

    版本:Word 2021 这个问题通常是因为文档中设置了网格,段落中设置了按照网格对齐. 下面记录网格的相关设置. 打开设置界面 布局-页边距-自定义页边距. 影响网格布局的所有因素 如果想将两篇文档 ...

  7. netcore限流

    netcore限流 using System; using System.Collections.Generic; using System.Threading.Tasks; using Micros ...

  8. k8s资源清单创建pod

    资源:对象 service pod deployment workload:pod,ReplicaSet,Deployment,statefulset,DaemonSet,Job,Crontabjob ...

  9. 2003 can't connect to mysql server on

    把配置文件my.ini换成如下所示: mysql和mysql数据存放路径都是加双斜线 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mys ...

  10. Friend Circles(dfs)——LeetCode进阶路

    原题链接https://leetcode.com/problems/friend-circles/ 题目描述 There are N students in a class. Some of them ...