poj 3358 Period of an Infinite Binary Expansion
2013-07-16 10:53
309 查看
由乘2取整得到分数的小数位,可以找到规律!!!
例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10……
取整后:1/10,2/10,4/10,8/10,6/10,2/10,4/10……
这样我们就发现规律了!!!
也就是对于p/q而言,要满足2^x=2^y mod q (gcd(p,q)==1);
化简:2^x*(2^(x-y)-1) = 0 mod q;
q里面2的倍数有多少个,就是最小的循环起始位置。
继而化简:2^(x-y) = 1 mod q' (q'除以2的倍数之后的值)
也就是求2^t = 1 mod q'
由欧拉定理知道:t=phi(q');但是这求出的t不一定是最小的,所以应该枚举t的约数,继而得到答案……
链接http://poj.org/problem?id=3358
View Code
例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10……
取整后:1/10,2/10,4/10,8/10,6/10,2/10,4/10……
这样我们就发现规律了!!!
也就是对于p/q而言,要满足2^x=2^y mod q (gcd(p,q)==1);
化简:2^x*(2^(x-y)-1) = 0 mod q;
q里面2的倍数有多少个,就是最小的循环起始位置。
继而化简:2^(x-y) = 1 mod q' (q'除以2的倍数之后的值)
也就是求2^t = 1 mod q'
由欧拉定理知道:t=phi(q');但是这求出的t不一定是最小的,所以应该枚举t的约数,继而得到答案……
链接http://poj.org/problem?id=3358
#include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<string> using namespace std; int prime[5000],m; bool f[5001]; void init() { __int64 i,j; m=0; for(i=2;i<=5000;i++) { if(f[i]==0) { prime[m++]=i; for(j=i*i;j<=5000;j+=i) f[j]=1; } } } __int64 gcd(__int64 a,__int64 b) { __int64 t; if(a<b) swap(a,b); while(b) { t=a; a=b; b=t%b; } return a; } __int64 euler(__int64 n) { __int64 ans=1; int i; for(i=0;i<m&&prime[i]<=n;i++) { if(n%prime[i]==0) { n/=prime[i]; ans*=prime[i]-1; while(n%prime[i]==0) { ans*=prime[i]; n/=prime[i]; } } } if(n!=1) ans*=n-1; return ans; } __int64 pows(__int64 a,int b,__int64 m) { __int64 ans=1; while(b) { if(b&1) ans=ans*a%m; b>>=1; a=a*a%m; } return ans; } int main() { init(); __int64 a,b,q,g,mmin; int i,j,p,k=0; while(scanf("%I64d/%I64d",&a,&b)!=EOF) { if(a==0) printf("Case #%d: %d,%I64d\n",++k,1,1); g=gcd(b,a); a=a/g;b=b/g; i=1; while(b%2==0) { b/=2; i++; } q=euler(b);j=i; mmin=q; for(i=1;i*i<=q;i++) { if(q%i==0) { if(pows(2,i,b)==1) { mmin=i; break; } p=q/i; if(pows(2,p,b)==1&&p<mmin) mmin=p; } } printf("Case #%d: %d,%I64d\n",++k,j,mmin); } return 0; }
View Code
相关文章推荐
- POJ 3358 Period of an Infinite Binary Expansion 解题报告(欧拉函数+因式分解)
- POJ 3358 Period of an Infinite Binary Expansion ★ (数论好题:欧拉函数)
- Period of an Infinite Binary Expansion POJ - 3358 欧拉函数
- poj 3358 Period of an Infinite Binary Expansion(欧拉函数+快速幂取模)
- POJ-3358-Period of an Infinite Binary Expansion 解题报告
- POJ 3358 Period of an Infinite Binary Expansion ★ (数论好题:欧拉函数)
- POJ 3358- Period of an Infinite Binary Expansion(欧拉函数+欧拉定理)
- POJ 3358 Period of an Infinite Binary Expansion
- poj3358 Period of an Infinite Binary Expansion 数论有难度
- poj 3358 Period of an Infinite Binary Expansion (费马小定理+分数化二进制小数)
- poj 3358 Period of an Infinite Binary Expansion 欧拉定理
- POJ 3358 Period of an Infinite Binary Expansion 欧拉函数+欧拉定理
- poj 3358——Period of an Infinite Binary Expansion
- poj 3358 Period of an Infinite Binary Expansion——欧拉函数+费马小定理
- POJ 3358 Period of an Infinite Binary Expansion(欧拉定理)
- poj 3358 Period of an Infinite Binary Expansion(欧拉函数+欧拉定理)
- POJ 3358 Period of an Infinite Binary Expansion
- poj_3358_Period of an Infinite Binary Expansion
- poj 3358 Period of an Infinite Binary Expansion(数论:欧拉函数+快速幂取模)
- POJ 3358 Period of an Infinite Binary Expansion