poj3358 Period of an Infinite Binary Expansion
Period of an Infinite Binary Expansion
题目大意:给你一个分数,求这个分数二进制表示下从第几位开始循环,并求出最小循环节长度。
注释:int范围内。
想法:这题说实话,是一道神题!我们思考一下,如何将一个小数换成二进制?连续的乘2,然后取首位。这样的比较简洁的转换方式注定了这题其实是可做的。我们可以抓住循环节的在这样的方法下是怎样形成的?显然,存在一个x,使得每多乘$2^x$都会使得所形成的答案相同。第二点,我们知道,一个分数的循环节开始之前是不参与循环的。这样,我们思考,多次反复的乘以2,它的整数部分modb是相同的对吧!?!我们在此就有一个式子,就是说
$2^i\cdot a\equiv 2^j\cdot a(mod\ b)$。其中j>i
可以变形为$2^j\cdot a-2^i\cdot a\equiv 0(mod\ b)$
$\Rightarrow 2^i\cdot a\cdot(2^{j-i}-1)$首先,我们在此之前不妨现将a,b弄成互质。现在,gcd(a,b)=1,所以,我们有
$2^i\cdot (2^{j-i}-1)\equiv 0(mod\ b)$
显然,我们想求最小值,我们发现,如果i的值增加,循环节的长度是不会改变的,所以,我们必须求出最小的且满足题意的i,而这个i,就是b中2的个数。剩下的,就是另一道题了。参考博主博客The Luckiest Number(The Luckiest Number?猛戳)。
最后,附上丑陋的代码......
#include <iostream>
#include <cstdio>
typedef long long ll;
using namespace std;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll quick_multiply(ll a,ll b,ll mod)
{
ll ans=;
a%=mod;
b%=mod;
while(b)
{
) ans=(ans+a)%mod;
b>>=;
a=(a+a)%mod;
}
return ans;
}
ll quick_power(ll a,ll b,ll mod)
{
ll ans=;
a%=mod;
while(b)
{
) ans=quick_multiply(ans,a,mod);
b>>=;
a=quick_multiply(a,a,mod);
}
return ans;
}
int main()
{
ll a,b;
ll cnt=;
while(~scanf("%I64d/%I64d",&a,&b))
{
ll k=a,r=b;
a/=gcd(k,r);
b/=gcd(k,r);
ll sum=;
==) b/=,sum++;
printf();
ll phi=b;
ll m=b;
;i*i<=m;++i)
{
)
{
phi=phi/i*(i-);
)
{
m/=i;
}
}
}
) phi=phi/m*(m-);
ll minn=phi;
;i*i<=phi;++i)
{
)
{
,i,b)==) minn=min(minn,i);
,phi/i,b)==) minn=min(minn,phi/i);
}
}
printf("%I64d\n",minn);
}
}
小结,我们发现,这题对于a的取值并没有什么要求,证明是显然的。
poj3358 Period of an Infinite Binary Expansion的更多相关文章
- poj3358 Period of an Infinite Binary Expansion 数论有难度
这道题目感觉好难,根本就是无从下手的感觉,尝试了以前的所有方法,都没有思路,毫无进展,参考了一下别人的思路,感觉学到了新的知识 接下来开始分析 观察1/10这组数据,按照二进制转化法可以得到: 1/1 ...
- 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 ...
- poj 2462 Period of an Infinite Binary Expansion
欧拉定理.根据分数转换成2进制的过程,分子每次都乘2.对于循环节x,当2^x = 1(mod b)时肯定是循环节.显然当分母不能整除2的时候,即分母和2互质的话,就可以利用欧拉定理,使得2^(Eule ...
- Period of an Infinite Binary Expansion 题解
Solution 简单写一下思考过程,比较水的数论题 第一个答案几乎已经是可以背下来的,在此不再赘述 考虑我们已经知道了\((p,q)\),其中\((p \perp q) \wedge (q \per ...
- acm数学(转)
这个东西先放在这吧.做过的以后会用#号标示出来 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能 ...
- [转] POJ数学问题
转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合 ...
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- ACM数学知识体系
在盛情收到学弟邀请给他们整理ACM数学方面的知识体系,作为学长非常认真的弄了好久,希望各学弟不辜负学长厚爱!!!非常抱歉因为电脑全盘格式化好多word.PPT都丢失,我尽量具体地给大家找到各知识点学习 ...
- Binary Tree 分类: POJ 2015-06-12 20:34 17人阅读 评论(0) 收藏
Binary Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6355 Accepted: 2922 Descr ...
随机推荐
- 泛型集合、datatable常用数据类型转换Json帮助类
泛型集合.datatable常用数据类型转换Json帮助类 using System; using System.Data; using System.Configuration; using Sys ...
- javaWeb学习之Listener监听
] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet listener filt ...
- 加深try catch Finnly的理解
上代码 public String twoGetFeeInfoByWithUnit(JSONArray jsonArray,String key1,String key2){ String Debit ...
- 十年Java开发程序员回答,自学Java,培训Java的利和弊
最近有一个朋友在群里面问我:是应该去培训Java还是应该自学Java,我想的说的是我并不是想给他一个去培训或者不去培训,我用自己多年对于行业的了解去分析这个问题,然后让他自己去思考,哪种更加适合他.他 ...
- java基础:内存分配(上)
java执行中的内存分区: 1.代码域:存放代码 2.数据域:存放静态的数据 3.栈:存放局部变量 4.堆:存放成员变量 (ps:局部变量是类中方法体中申明的变量,只在这个方法中有效:成员变量是类中方 ...
- jsoup.parse 的一个坑
那天,写好一个爬虫 爬取某个网站的数据. 当时调用了公司不知道某个人写的 一个方法 logger.info(joururl); doc= util.getDocument(joururl.toStri ...
- 小程序wx.navigateTo和wx.redirectTo 都无效
最近在写小程序,遇到页面跳转时,发现有几次失败.查询资料已解决,总结一下知识点: 一.如下,第5层到到6层时失败(评论页⑤-->返回商品详情页⑥) 登陆①-->主页②-->商品列表页 ...
- PHP随机函数-集锦
1 PHP随机函数收藏 function random_string($len = 6) { $chars = array( "a", "b", "c ...
- 常用表单验证&&常用正则
### 表单验证&&常用正则 ;(function(ELF){ ELF = ELF || (window.ELF = {}); var reg = {}, pattern = { /* ...
- Java高并发秒杀系统【观后总结】
项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番. 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并 ...