http://poj.org/problem?id=3358

(初始状态为分数形式)小数点进制转换原理:n / m ;

n /= gcd( n , m ) ;

m/= gcd( n , m ) ;

n = n % m ;

for( i : 0 to .....)

n *= k ;

bit[ i ] = n / m;(保留每一位的数值)

n %= m ;

题意:求n/m的小数点位的循环数列的长度和起始位置;

现在假设起始循环的第i个数为n,记作ni ;那么第j个数n,则是nj;这时循环数列出现,那么循环数列的长度为 L = j - i .

又根据小数点进制的计算原理,那么就有nj = ( ni * 2 ^ L ) % m ;————>2 ^ L % m == 1 % m ;(求t是利用这里求的)

当 m 与 2 互质时,根据欧拉定理,则有2^ phi( m ) == 1 %m ,因为2^ 0 == 1 , 所以起始点为0 ;也就是题目的1;

当二者不互质时,那么m % 2 != 0 ;

因此对等式进行化简 ,两边同时除以2的幂次(使得m与2互质,直到满足欧拉函数的条件),那么就有2^( L - t ) == 1 % ( m / ( 2 ^ t );可知,此时循环数列的起点为 t ,也就是题目的t+1;

最后我们要求的就是2^ L' = 1 % M' ;由于2^ k == 1 % m ',当k % m == 0 时取得有效值,因此,从小到大枚举phi(m')的因子,可得到最大值

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<iomanip> using namespace std;
int t, n, m, GCD, phi, ans1, ans2;
int temp, num;
int fac[1000000]; int gcd( int a , int b )
{
return b == 0 ? a : gcd( b , a % b );
} int euler(int n)
{
int ret=1,i;
for (i=2;i*i<=n;i++)
if (n%i==0)
{
n/=i,ret*=i-1;
while (n%i==0)
n/=i,ret*=i;
}
if (n>1)
ret*=n-1;
return ret;
}
int Pow( int a , int b , int c )
{
int ans = 1 ;
while( b > 0 )
{
if( b & 1 )
{
ans = ( long long ) ans * a % c ;
}
b >>= 1 ;
a = ( long long )a * a % c ;
}
return ans ;
} int main()
{
int Case = 1 ;
while( scanf( "%d/%d" , &n , &m ) != EOF )
{
GCD = gcd( n , m ) ;
n /= GCD ;
m /= GCD ;
t = 0 ;
while( m % 2 == 0 )
{
t++ ;
m /= 2 ;
}
ans1 = t + 1 ;
phi = euler( m ) ;
if( phi == 1 )
{
ans2 = 1 ;
}
else
{
int num = 0 ;
for( int i = 1 ; i * i <= phi ; ++i )
{
if( phi % i == 0 )
{
fac[ num++ ] = i ;
fac[ num++ ] = phi / i ;
}
}
sort( fac , fac + num ) ;
for( int i = 0 ; i < num ; ++i )
{
temp = Pow( 2 , fac[ i ] , m ) ;
if( temp == 1 )
{
ans2 = fac[ i ] ;
break ;
}
}
}
printf( "Case #%d: %d,%d\n" , Case++ , ans1 , ans2 ) ;
}
return 0 ;
}

poj3358数论(欧拉定理)的更多相关文章

  1. poj3358:欧拉定理

    又是一道用欧拉定理解的题..嗯,关键还是要建好方程,注意一些化简技巧 题目大意: 给定一个由 p / q 生成的循环小数,求此循环小数在二进制表示下的最小循环节以及不是循环节的前缀 思路: 小数化为二 ...

  2. Codeforces Beta Round #17 D. Notepad (数论 + 广义欧拉定理降幂)

    Codeforces Beta Round #17 题目链接:点击我打开题目链接 大概题意: 给你 \(b\),\(n\),\(c\). 让你求:\((b)^{n-1}*(b-1)\%c\). \(2 ...

  3. 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)

    [BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...

  4. 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

    数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...

  5. 数论的欧拉定理证明 &amp; 欧拉函数公式(转载)

    欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...

  6. 【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法

    题意:给你一个分数,求它在二进制下的循环节的长度,还有第一个循环节从哪一位开始. For example, x = 1/10 = 0.0001100110011(00110011)w and 0001 ...

  7. BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd

    题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...

  8. 【poj 1284】Primitive Roots(数论--欧拉函数 求原根个数){费马小定理、欧拉定理}

    题意:求奇质数 P 的原根个数.若 x 是 P 的原根,那么 x^k (k=1~p-1) 模 P 为1~p-1,且互不相同. (3≤ P<65536) 解法:有费马小定理:若 p 是质数,x^( ...

  9. poj3358 Period of an Infinite Binary Expansion 数论有难度

    这道题目感觉好难,根本就是无从下手的感觉,尝试了以前的所有方法,都没有思路,毫无进展,参考了一下别人的思路,感觉学到了新的知识 接下来开始分析 观察1/10这组数据,按照二进制转化法可以得到: 1/1 ...

随机推荐

  1. DotNet加密方式解析--散列加密

    没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...

  2. 介绍 Visifire 常用属性的设置

    转载自http://www.cnblogs.com/xinyus/p/3422198.html 主要介绍 Visifire 常用属性的设置,用来生成不同样式的图例 设置Chart的属 //设置titl ...

  3. IP地址变动后,https://localhost:1158/em无法访问解决办法

    一.解决的方法:重新配置em 二.步骤: 1.在 dos命令下输入 emca –repos drop 注意:监听端口号是一般是1521,特殊情况要在配置文件中找 2.成功删除资料档案库后,在dos下再 ...

  4. iOS之断点下载,使用NSURLSession简单封装

    最近公司需要做个文件管理的功能模块,刚交到博主手上时,头都大了.因为没做过这方面的东西,只好咬牙加班,并请教某位大神,指点了一下,清楚研究方向,找了网上大量资料,最后实现简单的封装. 上代码:.h文件 ...

  5. UISearchDisplayController简单使用

    最近在做一个简单的app入门,中间有一个页面用到了搜索框,本来以为很简单的控件,没想到用到的时候才发现很麻烦. 搜索框使用过程大约有以下几个状态:不活跃-活跃-输入关键词-根据关键词动态列出相关结果- ...

  6. js 计算两个日期之间的月数

    //返回两个日期相差的月数 function MonthsBetw(date1, date2) { //用-分成数组 date1 = date1.split("-"); date2 ...

  7. coconHashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  8. ubuntu中安装eclipse

    1.下载eclipse安装包 http://mirror.neu.edu.cn/eclipse/technology/epp/downloads/release/kepler/SR2/eclipse- ...

  9. Unicode的解救方案 - Windows程序设计(SDK)002

    Unicode的解救方案 让编程改变世界 Change the world by program 内容节选: 早期的Windows也是使用ASCII字符集,ASCII好处多多,但ASCII的第一个字母 ...

  10. 使用Eclipse开发Maven插件-1/3

    概要 1. 这是一个样例,基本照着<Maven实战>-徐晓斌,第17章照抄的:个人练手之作,不喜勿喷! 2. 代码行统计插件. 备注   大量插件可从以下网站获得:     1. http ...