• [51nod1035]最长的循环节


    题意:输出<=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=2;i*i<=n;i++){
            if(n%i==0){
                res=res/i*(i-1);
                while(n%i==0) n/=i;
            }
        }
        if(n!=1) res=res/n*(n-1);
        return res;
    }
    
    ll mod_pow(ll x,ll n,ll p){
        ll res=1;
        while(n){
            if(n&1) res=res*x%p;
            x=x*x%p;
            n>>=1;
        }
        return res;
    }
    
    int main(){
        int n;
        cin>>n;
        ll ans=0,tmp=0,res=0;
        for(ll i=1;i<=n;i++){
            ll t=euler_phi((int)i);
            tmp=0;
            for(int j=1;j<=t;j++){
                if(t%j==0){
                    if(mod_pow(10,j,i)==1){
                        tmp=j;
                        break;
                    }
                }
            }
            if(tmp>ans){
                ans=tmp;
                res=i;
            }
        }
        cout<<res<<"
    ";
        return 0;
    }

     

  • 相关阅读:
    jQuery 文本框得失焦点应用
    .NET 学习书籍推荐
    Android开发常见问题小结
    如何使用别人项目源码
    Android相关学习资料整理
    Android网络文件下载模块整理
    父类方法扩展
    继承后构造函数的关系
    私有属性和私有方法l
    面向对象
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7775807.html
Copyright © 2020-2023  润新知