poj3358 Period of an Infinite Binary Expansion 数论有难度
这道题目感觉好难,根本就是无从下手的感觉,尝试了以前的所有方法,都没有思路,毫无进展,参考了一下别人的思路,感觉学到了新的知识
接下来开始分析
观察1/10这组数据,按照二进制转化法可以得到: 1/10 2/104/108/1016/1032/10.……
对于每一个分子进行模10处理 可以相应的得到: 1/102/104/108/106/102/10……
出现了重复,这个重复就是要求的最小循环
对于p/q,首先p'=p/gcd(p,q),q'=q-gcd(p,q),然后求p'*2^i ≡ p'*2^j (mod q'),然后开始变换,p'*2^i*(2^(j-i)-1) ≡ 0 (mod q'),也就是说 q'|p'*2^i*(2^(j-i)-1),因为 gcd(p',q')=1所以q'|2^i*(2^(j-i)-1)
因为2^(j-i)-1肯定为奇数,所以q'有多少个2的幂,i就是多少,而且i就是循环开始前的第一位数字,令q''为q'除去2的幂之后的数,此时q''|2(j-i)-1,实际上就是 求 某个x 使得 2^x ≡ 1(mod q'');因为q''与2是互诉的,所以肯定有解,令 n=q'', 2^φ(n) ≡ 1 (mod n ),由于题目要求的是 最小的x,看似 φ(n) 是最终解,所以不妨 像poj3696那样大胆假设 x其实是 φ(n)的一个因子,推导符合题目要求,再反过来假设x不是φ(n)的因子, 令r=φ(n),mod x,r大于0,同时r<x,注意 2^φ(n) ≡ 1(mod n),且 2^x≡ 1(mod n),所以2^r %n=1,那么就存在一个比x更小的正整数 是的 2^r ≡ 1(mod n),所以 第二个假设失败,所以 x为 φ(n)的因子, 不断的寻找φ(n)的因子 然后判断是否符合题目要求即可
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set> #define ll long long #define eps 1e-8 #define inf 0xfffffff
const ll INF = 1ll<<61; using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
// int a,b,r[112]; int Gcd(int a,int b)
{
return b==0?a:Gcd(b,a%b);
} void detal(int x,int m)
{
r[0]=x%m;
for(int i=1;i<32;i++)
r[i]=(ll)r[i-1]*r[i-1]%m;
} int quick(int x,int y,int m)
{
int i=0,ans,j;
int d[50];
while(y)
{
d[i++]=y%2;
y>>=1;
}
for(j=0,ans=1;j<i;++j)
if(d[j])
ans=(ll)ans*r[j]%m;
return ans;
} int main()
{
int Case=0;
char s[102];
while(~scanf("%s",s))
{
a=0,b=0;
bool flag=false; for(int i=0;i<strlen(s);i++)
{
if(s[i] != '/' && !flag)
a=a*10+s[i]-'0';
else
flag=true;
if(flag && s[i] != '/')
b=b*10+s[i]-'0';
} if(a == 0)
{
printf("Case #%d: %d,%d\n",++Case,1,1);
continue;
}
int gcd=Gcd(a,b);
b/=gcd;
int x=0;
while(!(b&1))
{
b>>=1;
x++;
}
x++;
int c[112][2],k=0,a=b,ans=b;
for(int i=2;i*i<=a;i++)
{
if(a%i == 0)
{
ans-=ans/i;
a/=i;
while(a%i == 0)
a/=i;
}
}
if(a > 1)
ans-=ans/a;;
a=ans;
for(int i=2;i*i<=a;i++)
{
if(a%i == 0)
{
c[k][0]=i;
c[k][1]=0;
c[k][1]++;
while(a%i == 0)
{
c[k][1]++;
a/=i;
}
k++;
}
}
if(a > 1)
{
c[k][0]=a;
c[k][1]=1;
k++;
}
detal(2,b);
for(int i=0;i<k;i++)
{
for(int j=0;j<c[i][1];j++)
{
if(quick(2,ans/c[i][0],b) != 1)
break;
ans/=c[i][0];
}
}
printf("Case #%d: %d,%d\n",++Case,x,ans);
}
return EXIT_SUCCESS;
}
poj3358 Period of an Infinite Binary Expansion 数论有难度的更多相关文章
- poj3358 Period of an Infinite Binary Expansion
Period of an Infinite Binary Expansion 题目大意:给你一个分数,求这个分数二进制表示下从第几位开始循环,并求出最小循环节长度. 注释:int范围内. 想法:这题说 ...
- 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 ...
- sgu 137. Funny Strings 线性同余,数论,构造 难度:3
137. Funny Strings time limit per test: 0.25 sec. memory limit per test: 4096 KB Let's consider a st ...
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- acm数学(转)
这个东西先放在这吧.做过的以后会用#号标示出来 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能 ...
- [转] POJ数学问题
转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合 ...
- ACM数学知识体系
在盛情收到学弟邀请给他们整理ACM数学方面的知识体系,作为学长非常认真的弄了好久,希望各学弟不辜负学长厚爱!!!非常抱歉因为电脑全盘格式化好多word.PPT都丢失,我尽量具体地给大家找到各知识点学习 ...
随机推荐
- 调试qemu
最近需要给libvirt增加一个新feature,该feature基于qemu的最新代码. 我需要关心的: http://wiki.qemu.org/Features/Migration 需要自己编译 ...
- centos6 qt ENV
打算做嵌入式图像处理,计划方案嵌入式Linux+OpenCV+QT,昨天简单入门OpenCV今天看看QT,QT就先弄Linux下面的,回家之前争取把基本的摸通,然后能在板子上跑起来 关于QT安装 QT ...
- The Water Problem(排序)
The Water Problem Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- win8.1 安装webaccess遇到的写访问权限错误
大学的时候闲暇时间都用来玩游戏了,现在工作了,就把工作中遇到的问题和学习心得跟大家共享下,若有不对的地方欢迎指出,谢谢! 前几天突然想换用vs2013开发,就重装了win8.1系统,在新系统上安装we ...
- FilenameUtils工具类
转载请出自出处:http://eksliang.iteye.com/blog/2217081 一.概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的 ...
- 使用 AngularJS 从零构建大型应用
0.导言 1.准备工作 2.构建框架 3.丰富你的directives 4.公用的services 5.用controllers组织业务 导言 纵览线上各种AngularJS教程,大部分都是基础与一些 ...
- JavaScript引用类型之Object类型
在JavaScript中大多数的引用类型都是Object的实例,Object类型也是使用最多的类型! 创建Object类型实例的方式有两种,下面分别来分析一下: (1)第一种是使用new操作符后跟Ob ...
- python文件目录遍历保存成xml文件代码
Linux服务器有CentOS.Fedora等,都预先安装了Python,版本从2.4到2.5不等,而Windows类型的服务器也多数安装了Python,因此只要在本机写好一个脚本,上传到对应机器,在 ...
- springmvc+mybatis集成配置
简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spri ...