题意:输出<=n的数中倒数循环节长度最长的那个数

解题关键:http://w3.math.sinica.edu.tw/math_media/d253/25311.pdf

https://wenku.baidu.com/view/bf86107f11661ed9ad51f01dc281e53a580251a0.html

论文题,1/x的循环节长度  可转化为  已知整数n,求最小的k使10^k ≡1 (mod n),k<=x。

然后暴力即可。

循环节的长度确实与分子完全无关,只要分数的分母不变,循环节的长度就不会变。

注意:

1、分数必须为既约真分数。

2、把x中的2和5的因式全部去掉,这样不影响循环节长度,剩下的因式记为n1。

3、根据循环小数化为分数的方法,分母必然是99…9(k个9)=10^k-1,并且n1必然整除10^k-1,这样问题就转化为求满足10^k≡1 (mod n1)的最小正整数k。

4、循环小数化为分数的方法:

1/9=0.11111111111111111111…….对吧
假设有一个循环小数0.345634563456………
其中循环的是3456,从1/9怎样可以过度到0.3456…(3456循环)呢.我们可以把0.3456….(3456循环)看作是0.1…(1循环)中每四个1为一组的1111变成了3456,因此只需要给0.1..(1循环)乘以3456/1111就可以了.即1/9×3456/1111
同理可以得出如下规律:
0.259……(259循环)就可以写成1/9×259/111
0.123456……(123456循环)就可以写成1/9×123456/111111
0.205802713……(205802713循环)就可以写成1/9×205802713/111111111
以此类推这公式不言而喻了
0.a…b(a…b循环)=1/9×a…b/1…1=a…b/9…9
(说明:a…b代表一串数字,9…9的位数与a…b的位数相同)
如果碰上了这样的循环小数:
0.3456142857…(142857循环)怎么办呢,这里3456是不循环的
我们进行假设,如果知道了0.00001…(1循环)的分数是什么的话直接给他乘以142857/111111在加上不循环的0.3456即3456/10000的话就可以得出结果了
那么0.00001…(1循环)是多少呢
很显然0.1…(1循环)减去0.1111就是我们要的结果,也就是1/9-1111/10000
那么最后结果就是:
(1/9-1111/10000)×142857/111111+3456/10000
(1×10000-1111×9)/(9×10000)×(142857/111111)+3456/10000
(1/90000)×(142857/111111)+3456/10000
142857/(90000×111111)+3456/10000
(142857+3456×9×111111)/(90000×111111)
(142857+3456×999999)/(90000×111111)
(142857+3456×(1000000-1))/(90000×111111)
(142857+3456×1000000-3456)/(90000×111111)
(3456142857-3456)/9999990000
以此类推这公式也不言而喻了
设循环小数
0.c…da……b(a……b循环)
说明:c…d与a……b代表各自一串数字,a……b为循环部分,c…d为不循环部分,为了区别循环部分与不循环部分的位数,分别以……代表同a……b循环部分相同的数位,以…代表同c…d不循环部分相同的数位,
0.1(1循环)减去0.1…1就是0.0…01(1循环)
0.c…da……b(a……b循环)化分数的结果就是
(1/9-1…1/10…0)×a……b/1……1+c…d/10…0
然后来化简
(1×10…0-1…1×9)/(9×10…0)×(a……b/1……1)+c…d/10…0
(1/90…0)×(a……b/1……1)+c…d/10…0
a……b/(90…0×1……1)+c…d/10…0
(a……b+c…d×9×1……1)/(90…0×1……1)
(a……b+c…d×9……9)/(90…0×1……1)
(a……b+c…d×(10……0-1))/(90…0×1……1)
(a……b+c…d×10……0-c…d)/(90…0×1……1)
(c…da……b-c…d)/9……90…0
0.c…da……b(a……b循环)化分数的结果就是
(c…da……b-c…d)/9……90…0,其中……代表同a……b循环部分相同的数位,以…代表同c…d不循环部分相同的数位

 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
//sqrt(n)求欧拉函数值
ll euler_phi(int n){
int res=n;
for(int i=;i*i<=n;i++){
if(n%i==){
res=res/i*(i-);
while(n%i==) n/=i;
}
}
if(n!=) res=res/n*(n-);
return res;
} ll mod_pow(ll x,ll n,ll p){
ll res=;
while(n){
if(n&) res=res*x%p;
x=x*x%p;
n>>=;
}
return res;
} int main(){
int n;
cin>>n;
ll ans=,tmp=,res=;
for(ll i=;i<=n;i++){
ll t=euler_phi((int)i);
tmp=;
for(int j=;j<=t;j++){
if(t%j==){
if(mod_pow(,j,i)==){
tmp=j;
break;
}
}
}
if(tmp>ans){
ans=tmp;
res=i;
}
}
cout<<res<<"\n";
return ;
}

最新文章

  1. 深入理解javascript选择器API系列第二篇——getElementsByClassName
  2. Clang与libc++abi库安装
  3. iOS UIAlertController跟AlertView用法一样 &amp;&amp; otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法
  4. HTML5 音频 &lt;audio&gt;
  5. 重写List集合的ToString方法
  6. iOS 保存CGRect,CGPoint到NSArray&#39;的方法
  7. [原]Android Studio查询SHA1的方法
  8. 在Html中使用JavaScript的几点小结
  9. Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell&#39;s content view...
  10. browsersync 浏览器自动刷新神器
  11. 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数
  12. 第11章 使用OpenID Connect添加用户身份验证 - Identity Server 4 中文文档(v1.0.0)
  13. shell 命令 grep -v
  14. vue教程1-05 事件 简写、事件对象、冒泡、默认行为、键盘事件
  15. Unity编辑器下,界面替换NGUI字体以及字号
  16. 005-spring boot 2.0.4-jdbc升级
  17. 这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法.
  18. HwUI下载地址
  19. vue-cli脚手架里如何配置屏幕自适应
  20. 【Scala】Scala技术栈

热门文章

  1. Mybatis的配置文件和映射文件详解
  2. django框架小技巧
  3. 九度OJ 1058:反序输出 (基础题)
  4. 借助nodejs解析加密字符串 node安装库较python方便
  5. RocksDB
  6. 宿舍更换的新淋浴喷头&quot;水温vs旋钮角度&quot;关系的研究(曲线)
  7. win7下搭建nginx+php的开发环境(转)
  8. spring mvc头
  9. TensorFlow框架(4)之CNN卷积神经网络详解
  10. Springboot2.0入门介绍