问题描述

给一个正整数N,问是否存在N的倍数M,且M的各个位全部由数字8组成,如果存在多个取最小的M;并输出M由几个8组成。

输入格式

一行,一个整数N

输出格式

一行一个整数,表示所求的结果
如果无解,输出0

由题得:M==t*N.

由于M==8*11……1,设n==11……1有k位,则n可以表示为:n==10^(k-1)+10^(k-2)+……+10^0.

因为这是一个等比数列,公比q==10,所以根据等比数列求和公式,n==(10^k-1)/9.

带入最开始的式子M==t*N,得到:M==8*n==8*(10^k-1)/9==t*N,移项,得:8*(10^k-1)==9*t*N.

继续化简,由于8和9*t是已知数,所以对它们约分。设d==gcd(8,9*t),则(8/d)*(10^k-1)==(9*t/d)*N.

由于8/d和9*t/d互质,所以(10^k-1)中含因子9*t/d。令m==9*t/d,则(10^k-1)%m==0,所以10^k%m==1,即10^k与m互质.

根据欧拉定理,当a与b互质时,a^phi(b)%b==1.由于10^k%m==1,所以k的一个解就是phi(m).**

幂运算取模有循环节(尽管我并不知道这是为何)。对于10^phi(m)%m==1,设循环节长度为s。显然,10^0%m==1,10^(0+i*s)%m==1即10^(i*s)%m==1。所以,phi(m)==i*s,由于我们实际上不知道s的值,所以问题就变成了求phi(m)内的因数(把phi(m)的因数往式子里面带,找出最小的符合条件的因数)。

总结

1.当数字由若干个重复的数字组成时,可用位数来表示这个数(指数形式)

2.如果(a-1)%p==0,那么a%p==1

3.幂运算取模有循环节;可以通过这一性质对幂运算降幂

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll qui(ll a,ll b,ll c){ll ans=0;while(b){if(b&1)ans=(ans+a)%c;b>>=1,a=(a<<1)%c;}return ans;
}
ll getPhi(ll n){ll ans=n,a=n;for(ll i=2;i*i<=a;i++)if(a%i==0){ans-=ans/i;while(a%i==0)a/=i;}if(a>1)ans-=ans/a;return ans;
}
ll mont(ll a,ll b,ll c){ll ans=1;a%=c;while(b){if(b&1)ans=qui(ans,a,c);b>>=1,a=qui(a,a,c);}return ans;
}
int main(){ll n,m,p,pp,ans=2e9+1;scanf("%lld",&n);m=(9*n)/__gcd(8LL,9*n);if(__gcd(10LL,m)!=1){printf("0");return 0;} p=getPhi(m),pp=sqrt(p)+0.5;for(ll i=1;i<=pp;i++)if(p%i==0){if(mont(10,i,m)==1){printf("%lld",i);return 0;}if(mont(10,p/i,m)==1)ans=min(ans,p/i);}printf("%lld",ans);return 0;
}

NKOJ3685 8数相关推荐

  1. 2023年你最值得了解的信息技术-AI篇(一)

    列表 85 - 其他 辽宁省 大连优联智能 自动化生产线提供商 未融资 大连优联智能是一家自动化生产线提供商,集规划设计.制造安装.系统集成.视觉检测及AI数据智能分析于一体,可为汽车车身及发动机制造 ...

  2. 伍六七带你学算法 进阶篇-三数之和

    三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  3. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  4. 十进制转化为二进制java代码_【模板小程序】任意长度十进制数转化为二进制(java实现)...

    妈妈再也不用担心十进制数过大了233 import com.google.common.base.Strings; import java.math.BigInteger; import java.u ...

  5. HJ86 求最大连续bit数

    描述 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 本题含有多组样例输入. 输入描述: 输入一个byte数字 输出描述: 输出转成二进制之后连续 ...

  6. Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)

    1. keys 键相关命令 命令 说明 dbsize 返回当前数据路的key数量 exists key 测试指定key是否存在 expire key seconds 为key指定过期时间 type k ...

  7. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  8. 数据类型对应的字节数

    20210622 https://www.icode9.com/content-4-421680.html 32位和64位常用数据结构所占字节数 20210126 1 2 4 8 1248 刚好都是2 ...

  9. LeetCode简单题之将整数转换为两个无零整数的和

    题目 「无零整数」是十进制表示中 不含任何 0 的正整数. 给你一个整数 n,请你返回一个 由两个整数组成的列表 [A, B],满足: A 和 B 都是无零整数 A + B = n 题目数据保证至少有 ...

最新文章

  1. Worktile CTO 管理经验分享:如何在研发团队落地OKR?研发团队目标如何管理?
  2. 如何在JavaScript / jQuery中查找数组是否包含特定字符串? [重复]
  3. Link State ID
  4. ubuntu下安装配置nfs
  5. Elasticsearch进阶
  6. 5G商用将满一年,6G研发开始了...
  7. 1212: [HNOI2004]L语言
  8. idea一直在copying resources或者一直在发布 问题解决
  9. java reactor模式例子_JAVA BIO,NIO,Reactor模式总结
  10. Volley的原理解析
  11. 基于nvidia的ffmpeg编解码加速
  12. 小数分频器vhdl实现_基于VHDL的小数分频器设计
  13. 编译安装wpa_supplicant
  14. 海底捞激励员工的方法符合哪些激励理论的建议
  15. 论文笔记——Comparing to Learn
  16. TFP-161/100/6MM/6MM/MPU在红尘里,靠近菩提
  17. flutter安装及过程中遇到的问题解决
  18. canvas学习日记一
  19. 有的小伙伴问我英语不好可以学编程吗?
  20. c语言快速判断一个数是偶数还是奇数

热门文章

  1. vostro3070装win7_戴尔Vostro 成就 3070台式机装win7系统及bios设置
  2. C#销毁资源,释放内存,GC垃圾回收
  3. 计算机必学知识,基础电脑知识:计算机操作常识入门必学
  4. AWS VPC 概述
  5. X86-64、X64、X86
  6. ENVI+IDL使用
  7. 内存耗用:VSS/RSS/PSS/USS
  8. 20165334 学习基础与c语言学习心得
  9. ElasticSearch 全文搜索引擎;ES 搜索引擎
  10. 程序员北漂没钱整租,如何爱上合租?