51Nod1037 最长的循环节 V2


题目看这里
小学奥数题目23333
首先我们知道, 0.0˙0...001˙=1/99..9 0. 0 ˙ 0...00 1 ˙ = 1 / 99..9
那么任意一个循环小数都可以写成以 10k1 10 k − 1 为分母的分数
让后稍加分析就知道,满足条件的最小的k就是循环节的长度
那么题目就变成了求一个数s,使得满足 10k=1 ( mod s ) 10 k = 1   (   m o d   s   ) 这样的k最大
我们将k记为 f(s) f ( s )
首先由欧拉定理得 10ϕ(s)=1(mod s) 10 ϕ ( s ) = 1 ( m o d   s ) 所以 f(s)|ϕ(s) f ( s ) | ϕ ( s )
让后再根据打表的规律,我们发现满足条件的数其实非常多(密度>0.5)
所以我们可以猜测,只有当 f(s)=ϕ(s) f ( s ) = ϕ ( s ) 时才能取到最多(否则 2f(s)<=ϕ(s) 2 f ( s ) <= ϕ ( s )
于是我们采用 Miller Rabin+Pollard Rho M i l l e r   R a b i n + P o l l a r d   R h o 来分解质因数求 ϕ ϕ ,从n开始向 下枚举即可,由于密度很高,所以很快就可以得到答案

#pragma GCC opitmize("O3") # p r a g m a   G C C   o p i t m i z e ( " O 3 " )
#pragma G++ opitmize("O3") # p r a g m a   G + +   o p i t m i z e ( " O 3 " )
#include<time.h> # i n c l u d e < t i m e . h >
#include<vector> # i n c l u d e < v e c t o r >
#include<stdio.h> # i n c l u d e < s t d i o . h >
#include<string.h> # i n c l u d e < s t r i n g . h >
#include<algorithm> # i n c l u d e < a l g o r i t h m >
#define LL long long # d e f i n e   L L   l o n g   l o n g
using namespace std; u s i n g   n a m e s p a c e   s t d ;
vector<LL> s,t,w; v e c t o r < L L >   s , t , w ;
inline LL mul(LL x,LL k,LL M,LL s=0){ i n l i n e   L L   m u l ( L L   x , L L   k , L L   M , L L

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值