NKOJ3685 8数
问题描述
给一个正整数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数相关推荐
- 2023年你最值得了解的信息技术-AI篇(一)
列表 85 - 其他 辽宁省 大连优联智能 自动化生产线提供商 未融资 大连优联智能是一家自动化生产线提供商,集规划设计.制造安装.系统集成.视觉检测及AI数据智能分析于一体,可为汽车车身及发动机制造 ...
- 伍六七带你学算法 进阶篇-三数之和
三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...
- 使用python愉快地做高数线代题目~
今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...
- 十进制转化为二进制java代码_【模板小程序】任意长度十进制数转化为二进制(java实现)...
妈妈再也不用担心十进制数过大了233 import com.google.common.base.Strings; import java.math.BigInteger; import java.u ...
- HJ86 求最大连续bit数
描述 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 本题含有多组样例输入. 输入描述: 输入一个byte数字 输出描述: 输出转成二进制之后连续 ...
- Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
1. keys 键相关命令 命令 说明 dbsize 返回当前数据路的key数量 exists key 测试指定key是否存在 expire key seconds 为key指定过期时间 type k ...
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...
- 数据类型对应的字节数
20210622 https://www.icode9.com/content-4-421680.html 32位和64位常用数据结构所占字节数 20210126 1 2 4 8 1248 刚好都是2 ...
- LeetCode简单题之将整数转换为两个无零整数的和
题目 「无零整数」是十进制表示中 不含任何 0 的正整数. 给你一个整数 n,请你返回一个 由两个整数组成的列表 [A, B],满足: A 和 B 都是无零整数 A + B = n 题目数据保证至少有 ...
最新文章
- Worktile CTO 管理经验分享:如何在研发团队落地OKR?研发团队目标如何管理?
- 如何在JavaScript / jQuery中查找数组是否包含特定字符串? [重复]
- Link State ID
- ubuntu下安装配置nfs
- Elasticsearch进阶
- 5G商用将满一年,6G研发开始了...
- 1212: [HNOI2004]L语言
- idea一直在copying resources或者一直在发布 问题解决
- java reactor模式例子_JAVA BIO,NIO,Reactor模式总结
- Volley的原理解析
- 基于nvidia的ffmpeg编解码加速
- 小数分频器vhdl实现_基于VHDL的小数分频器设计
- 编译安装wpa_supplicant
- 海底捞激励员工的方法符合哪些激励理论的建议
- 论文笔记——Comparing to Learn
- TFP-161/100/6MM/6MM/MPU在红尘里,靠近菩提
- flutter安装及过程中遇到的问题解决
- canvas学习日记一
- 有的小伙伴问我英语不好可以学编程吗?
- c语言快速判断一个数是偶数还是奇数