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 ...
随机推荐
- [PHP开发] phpmailer问题 错误原因: Could not instantiate mail function
Send via the PHP mail() function function mail_send($header, $body) { // Create mail recipient list ...
- 常用YUV转RGB代码
常用YUV转RGB [java] view plaincopyprint? public class YuvToRGB { private static int R = 0; private stat ...
- Java循环和条件
下列程序的输出结果是什么? 1.Java循环和条件 /** * @Title:IuputData.java * @Package:com.you.data * @Description:TODO * ...
- Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
1 错误描述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.s ...
- JDBCTemplate简化JDBC的操作(二)
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
- 简要分析javascript的选项卡和轮播图
选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i&l ...
- Bzoj4869: [Shoi2017]相逢是问候
题面 传送门 Sol 摆定理 \[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~ ...
- 如何使用mysqldump备份数据库
一.背景 在开发项目中,数据库是核心资产.除了做主备冗余增加可靠性外,定期备份数据也是必须的. 使用mysqldump备份数据具有操作简单,备份和恢复时间短的优点(mysqldump备份数据生成的是批 ...
- mysql大小写敏感问题
问题: 在创建mysql表的时候发现不论表明是大写或小写,建完之后统一被变成了小写. 原因: MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写. ...
- PLSQL Developer连接远程数据库的配置
去Oracle的安装目录找到:D:\oracle\NETWORK\ADMIN这个路径下面的tnsnames.ora文件 修改文件: 这个是本地的 ORCL = (DESCRIPTION = (ADDR ...