poj 3358 Period of an Infinite Binary Expansion
由乘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
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
int prime[],m;
bool f[];
void init()
{
__int64 i,j;
m=;
for(i=;i<=;i++)
{
if(f[i]==)
{
prime[m++]=i;
for(j=i*i;j<=;j+=i)
f[j]=;
}
}
}
__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=;
int i;
for(i=;i<m&&prime[i]<=n;i++)
{
if(n%prime[i]==)
{
n/=prime[i];
ans*=prime[i]-;
while(n%prime[i]==)
{
ans*=prime[i];
n/=prime[i];
}
}
}
if(n!=)
ans*=n-;
return ans;
}
__int64 pows(__int64 a,int b,__int64 m)
{
__int64 ans=;
while(b)
{
if(b&)
ans=ans*a%m;
b>>=;
a=a*a%m;
}
return ans;
}
int main()
{
init();
__int64 a,b,q,g,mmin;
int i,j,p,k=;
while(scanf("%I64d/%I64d",&a,&b)!=EOF)
{
if(a==)
printf("Case #%d: %d,%I64d\n",++k,,);
g=gcd(b,a);
a=a/g;b=b/g;
i=;
while(b%==)
{
b/=;
i++;
}
q=euler(b);j=i;
mmin=q;
for(i=;i*i<=q;i++)
{
if(q%i==)
{
if(pows(,i,b)==)
{
mmin=i;
break;
}
p=q/i;
if(pows(,p,b)==&&p<mmin) mmin=p;
}
}
printf("Case #%d: %d,%I64d\n",++k,j,mmin);
}
return ;
}
poj 3358 Period of an Infinite Binary Expansion的更多相关文章
- poj 2462 Period of an Infinite Binary Expansion
欧拉定理.根据分数转换成2进制的过程,分子每次都乘2.对于循环节x,当2^x = 1(mod b)时肯定是循环节.显然当分母不能整除2的时候,即分母和2互质的话,就可以利用欧拉定理,使得2^(Eule ...
- poj3358 Period of an Infinite Binary Expansion
Period of an Infinite Binary Expansion 题目大意:给你一个分数,求这个分数二进制表示下从第几位开始循环,并求出最小循环节长度. 注释:int范围内. 想法:这题说 ...
- poj3358 Period of an Infinite Binary Expansion 数论有难度
这道题目感觉好难,根本就是无从下手的感觉,尝试了以前的所有方法,都没有思路,毫无进展,参考了一下别人的思路,感觉学到了新的知识 接下来开始分析 观察1/10这组数据,按照二进制转化法可以得到: 1/1 ...
- Period of an Infinite Binary Expansion 题解
Solution 简单写一下思考过程,比较水的数论题 第一个答案几乎已经是可以背下来的,在此不再赘述 考虑我们已经知道了\((p,q)\),其中\((p \perp q) \wedge (q \per ...
- KMP POJ 1961 Period
题目传送门 /* 题意:求一个串重复出现(>1)的位置 KMP:这简直和POJ_2406没啥区别 */ /******************************************** ...
- POJ 1961 Period( KMP )*
Period Time Limit: 3000MSMemory Limit: 30000K Total Submissions: 12089Accepted: 5656 Description For ...
- poj 1961 Period
Period http://poj.org/problem?id=1961 Time Limit: 3000MS Memory Limit: 30000K Description Fo ...
- KMP——POJ-3461 Oulipo && POJ-2752 Seek the Name, Seek the Fame && POJ-2406 Power Strings && POJ—1961 Period
首先先讲一下KMP算法作用: KMP就是来求在给出的一串字符(我们把它放在str字符数组里面)中求另外一个比str数组短的字符数组(我们叫它为ptr)在str中的出现位置或者是次数 这个出现的次数是可 ...
- POJ 1961 Period(KMP)
http://poj.org/problem?id=1961 题意 :给你一个字符串,让你输出到第几个字符时,循环结的个数. 思路 :这个题和2409差不多,稍微修改一下,加一个循环就行了,用的也是K ...
随机推荐
- 【风马一族_Android】第4章Android常用基本控件
第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...
- [Android教程]TextView使用SpannableString设置复合文本
TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...
- 原始套接字的简单tcp包嗅探
原始套接字 sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); while(1) { data_size = recvfrom(sock_raw ...
- 1049. Counting Ones/整数中1出现的次数(从1到n整数中1出现的次数)
The task is simple: given any positive integer N, you are supposed to count the total number of 1's ...
- HDU 1465 第六周L题
Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样. ...
- 8、WPF体系架构和运行机制
体系架构:http://msdn.microsoft.com/zh-cn/library/ms750441.aspx 运行机制:http://www.cnblogs.com/leep2007/arch ...
- python之super()函数
python之super()函数 python的构造器奇特, 使用魔方. 构造器内对基类对象的初始化同样也很奇特, 奇特到没有半点优雅! 在构造器中使用super(class, instance)返回 ...
- Swift学习:闭包(Closures)
/* 闭包(Closures)* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值.* 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类 ...
- 二、有限状态机(FSM)
1.状态机的作用?是什么? 状态机,顾名思义就是用来描述状态的.完善一点就是在同一的时钟下.更准确说是一种verilogHDL编程思想. 例如我们每一个系统都可以分为好几种状态,如:开始,初始化,运行 ...
- Java Day 04
01 语句 循环结构 嵌套 列的递减 1-5 2-5 3-5// 1-5 1-4 1-3 转义字符 \n 回车 \t 制表符 \b 退格 \r 按下回车键 windows 回车符由 \r \n 组成 ...