POJ 3358 (欧拉定理)

题目:求 q/p 二进制小数的循环节,起点和长度。

若满足 2^phi[ n ] = 1 (mod n )   则 数 t = phi [ n ] 一定有一个使 2^k=1 (mod n )成立的 因子 k

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#define bug(a) cout<<a<<"--->\n";
#define N 100000
using namespace std;

typedef unsigned long long  LL;

LL euler_phi(LL n)
{
    LL m=(LL)sqrt(n+0.5);
    LL ans=n;
    for(LL i=2;i<=m;i++)
    {
        if(n%i==0){
        ans=ans/i*(i-1);
        while(n%i==0) n/=i;
        }
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}

LL gcd(LL a,LL b)
{
    LL r;
    if(b>a) swap(a,b);
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }

    return a;
}

void factor(LL n,LL *fac,int &cnt)    //求因数,保存于 fac[1001]
{
    cnt=0;
    LL m=(LL)sqrt(n+0.5);
    for(LL i=1;i<=m;i++)
    {
        if(n%i==0)
        {
            fac[cnt++]=i;
            fac[cnt++]=n/i;
        }
    }
    sort(fac,fac+cnt);
}

LL qpow(LL a,LL b,LL p)
{
    LL ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%p;
        a=a*a%p;
        b>>=1;
    }
    return ans;
}

int main()
{
    LL p_,q_;
    LL p,q;
    char c;
    int t=0;
    while(scanf("%I64d%c%I64d",&p_,&c,&q_)!=EOF)
    {
        LL g=gcd(p_,q_);

        p=p_/g;
        q=q_/g;
        int m=0;
        while(q%2==0)
        {
            q/=2;
            m++;
        }
        int cnt;
        LL fac[1001];
        factor(euler_phi(q),fac,cnt);
        int i;
        for(i=0;i<cnt;i++)
        {
            if(qpow(2,fac[i],q)==1)
                break;
        }

        printf("Case #%d: %d,%I64d\n",++t,m+1,fac[i]);
    }

    return 0;
}

POJ 3358 (欧拉定理)

时间: 2024-10-09 05:49:15

POJ 3358 (欧拉定理)的相关文章

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 )

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 ) #include <cstdio> #include <cstring> #include <algorithm> #include <algorithm> using namespace std; typedef long long LL; LL fac[ 100000 ], pf; LL gcd( LL a, LL

Period of an Infinite Binary Expansion POJ - 3358(欧拉函数)

Period of an Infinite Binary Expansion POJ - 3358 题意:给一个分数,让求其二进制形式的最小循环节ans2和循环节开始的位置ans1. 以下内容转自http://blog.csdn.net/u013508213/article/details/42496543 小数二进制的转换方法就是不断*2,mod 分母. 比如:1/10  2/10  4/10  8/10  16/10  32/10... 模后:1/10  2/10  4/10  8/10  

POJ 3358

此题的主要还是如何把小数化作分数来解答. 设p/q.对于二进制(三进制,四进制一样),若p>q便商1,取mod,p*2-->p,然后再作p/q,若p<q,商0. 于是有,在去公约数GCD后,p/q的小数是否重复,和上述步骤p是否重复是一致的.若重复,得方程 p*2^i=p*2^j (mod q).则有p*2^i(2^(j-i)-1)=0 (mod q).即q|2^i(2^(j-i)-1).而要求最小,只需使两者相等.即q中2的幂即为i.利用欧拉定理也可求出j-i的最小值. #includ

POJ 3358- Period of an Infinite Binary Expansion(欧拉函数+欧拉定理)

Period of an Infinite Binary Expansion Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3358 Appoint description:  System Crawler  (2015-04-08) Description Let {x} = 0.a1a2a3... be the binary rep

数学之欧拉函数 &amp;几道poj欧拉题

欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int Euler(int n) { int res=n; for(int i=2;i*i<=n;i++) { while(n%i==0) { n/=i; res

平面上欧拉定理:poj 2284( LA 3263 ) That Nice Euler Circuit

3263 - That Nice Euler Circuit Time limit: 3.000 seconds Description Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his primary school Joey heard about the nice story of how Euler started the study abo

poj 3696 欧拉函数

poj 3696 题意: 给出一个数字L,求出最短的888...8能被L整除,输出最短的长度. 限制: 1 <= L <= 2*10^9 思路: 设x为最小长度 888...8=(10^x-1)/9*8 由题意得: (10^x-1)/9*8 % L=0 -> (10^x-1)*8 % (9L) = 0 -> (10^x-1) % (9L/gcd(L,8)) = 0 -> 10^x % (9L/gcd(L,8)) = 1 这个是一个离散对数的问题,第一个想到的是用拓展BSGS做

poj 3641 Pseudoprime numbers Miller_Rabin测素裸题

题目链接 题意:题目定义了Carmichael Numbers 即 a^p % p = a.并且p不是素数.之后输入p,a问p是否为Carmichael Numbers? 坑点:先是各种RE,因为poj不能用srand()...之后各种WA..因为里面(a,p) ?= 1不一定互素,即这时Fermat定理的性质并不能直接用欧拉定理来判定..即 a^(p-1)%p = 1判断是错误的..作的 #include<iostream> #include<cstdio> #include&l

poj 2478 Farey Sequence(基于素数筛法求欧拉函数)

http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它基本的性质. 1.欧拉函数是求小于n且和n互质(包括1)的正整数的个数.记为φ(n). 2.欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求幂的模. 3.若p是一个质数,那么φ(p) = p-1,注意φ(1) = 1. 4.欧拉函数是积性函数: 若m与n互质,那么φ(nm) = φ(n) * φ(m). 若n = p^k且p为质数,那么φ(n) = p^k - p