题意:给你一个分数,求它在二进制下的循环节的长度,还有第一个循环节从哪一位开始。

For example, x = 1/10 = 0.0001100110011(00110011)w and 0001100110011 is a preperiod and 00110011 is a period of 1/10.

思路一:

我们可以观察一下1/10这组数据,按照二进制转换法(乘二法),我们可以得到:
1/10 2/10 4/10 8/10 16/10 32/10 ...
然后都分子都尽可能减去10,得到:
1/10 2/10 4/10 8/10 6/10 2/10 ...
这时候,发现出现了重复,那么这个重复就是我们要求的最小循环。
抽象出模型如下:对p/q
首先p'=p/gcd(p,q)
q'=q/gcd(p,q); 然后我们就是求p'*2^i == p'*2^j (mod q') (“==”表示同余,i<j)
经过变换得到:
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'')

就是求p*(2^i) == p*(2^j) (mod q),除过来就是2^(i-j)==1(mod q)

思路二:转自http://www.cnblogs.com/Konjakmoyu/p/5183339.html

实现方法:

方法一: 直接BSGS

求2^x==1(mod n),就先消因子,然后在BSGS求解。

过程中如果b%d!=0,那就说明在x>=T时无解。

方法二:欧拉定理

先消因子,则2与n互质。

求2^x==1(mod n),根据欧拉定理2^phi(n)==1(%n),然后找phi(n)的质因子k。

从小到大枚举质因子k,判断2^k==1(%n)则的得到答案。

代码

BSGS的:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL;
const LL N=;
LL pl,bl;
LL p[N];
bool vis[N];
struct node{
LL d,id;
}bit[N]; bool cmp(node x,node y){
if(x.d==y.d) return x.id<y.id;
return x.d<y.d;
} LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==) {x=,y=;return a;}
LL tx,ty;
LL d=exgcd(b,a%b,tx,ty);
x=ty;y=tx-(a/b)*ty;
return d;
} LL find(LL x)
{
int l=,r=bl;
while(l<=r)
{
int mid=(l+r)>>;
if(bit[mid].d==x) return bit[mid].id;
if(bit[mid].d<x) l=mid+;
if(bit[mid].d>x) r=mid-;
}
return -;
} void exBSGS(LL b,LL &xx,LL &yy)
{
LL t,m,g,x,y,pm,am;
while(b%==) {b/=;xx++;}
t=;
for(int i=;i<=;i++)
{
if(t%b==) {yy=i;return ;}
t=t*%b;
}
m=(LL)(ceil((double)sqrt((double)b)));
pm=%b;bit[].d=%b;bit[].id=;
for(int i=;i<=m;i++)
{
bit[i].d=bit[i-].d*%b;
bit[i].id=i;
pm=pm*%b;
}
sort(bit+,bit++m,cmp);
bl=;
for(int i=;i<=m;i++)
{
if(bit[i].d!=bit[bl].d) bit[++bl]=bit[i];
}
exgcd(pm,b,x,y);
am=x%b+b;
t=%b;
for(int i=;i<=m;i++)
{
x=find(t);
if(x!=-) {yy=i*m+x;return ;}
t=t*am%b;
}
return ;
} int main()
{
freopen("a.in","r",stdin);
freopen("b.out","w",stdout);
LL T=,a,b;
char c;
while(scanf("%I64d%c%I64d",&a,&c,&b)!=EOF)
{
LL x,y;
LL g=exgcd(a,b,x,y);
a/=g,b/=g;
x=,y=-;
exBSGS(b,x,y);
printf("Case #%I64d: %I64d,%I64d \n",++T,x,y);
}
return ;
}

欧拉定理的:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL;
const LL Max=(LL)1e6;
const LL N=Max+;
LL fl;
LL f[N]; LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
} bool cmp(int x,int y){return x<y;} LL eular(LL x)
{
LL ans=x;
for(int i=;i*i<=x;i++)
{
if(x%i==) ans/=i,ans=ans*(i-);
while(x%i==) x/=i;
}
if(x>) ans/=x,ans=ans*(x-);
return ans;
} LL quickpow(LL a,LL b,LL mod)
{
LL ans=%mod;
while(b)
{
if(b&) ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
} void solve(LL b,LL &xx,LL &yy)
{
LL k=,x=b,ans=x;
while(b%==) xx++,b/=;
LL phi=eular(b);
for(int i=;i*i<=phi;i++)
{
if(phi%i==) f[++fl]=i,f[++fl]=phi/i;
}
sort(f+,f++fl,cmp);
for(int i=;i<=fl;i++)
{
if(quickpow(,f[i],b)==) {yy=f[i];return ;}
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
LL T=,a,b;
char c;
while(scanf("%I64d%c%I64d",&a,&c,&b)!=EOF)
{
LL x=,y=;
LL g=gcd(a,b);
a/=g,b/=g;
solve(b,x,y);
printf("Case #%I64d: %I64d,%I64d \n",++T,x,y);
}
return ;
}

【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法的更多相关文章

  1. 高斯消元(Gauss消元)

    众所周知,高斯消元可以用来求n元一次方程组的,主要思想就是把一个n*(n+1)的矩阵的对角线消成1,除了第n+1列(用来存放b的)的其他全部元素消成0,是不是听起来有点不可思议??! NO NO NO ...

  2. 高斯消元和高斯约旦消元 Gauss(-Jordan) Elimination

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵. 在讲算法前先介绍些概念 矩阵的初等变换 矩阵的初等变换又分为矩阵的初等行变换和矩阵的初等列变换 ...

  3. 基于FPGA的key button等开关消抖,按键消抖电路设计

    最近要用上一个key消抖的功能.于是找到了之前写的并放入博客的程序,发现居然全部有问题.http://www.cnblogs.com/sepeng/p/3477215.html —— 有问题,包括很多 ...

  4. 为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?

    先看HashMap的定义: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V> ...

  5. HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版

    题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...

  6. [问题2014A04] 解答

    [问题2014A04]  解答 (1) 由条件可得 \(AB+BA=0\), 即 \(AB=-BA\), 因此 \[AB=A^2B=A(AB)=A(-BA)=-(AB)A=-(-BA)A=BA^2=B ...

  7. key单片机按键抖动

    //write by:cyt //Time:2017-2-10 //Porject Name:key shake_destory #include<reg51.h> #define GPI ...

  8. Mongodb的性能优化问题

    摘要 数据库性能对软件整体性能有着至关重要的影响,对于Mongodb数据库常用的性能优化方法主要有: 范式化与反范式化: 填充因子的使用: 索引的使用: 一. 范式化与反范式化 范式是为了消除重复数据 ...

  9. POJ 3185 The Water Bowls (高斯消元)

    题目链接 题意:翻译过来就是20个0或1的开关,每次可以改变相邻三个的状态,问最小改变多少次使得所有开关都置为0,题目保证此题有解. 题解:因为一定有解,所以我们可以正序逆序遍历两次求出较小值即可.当 ...

随机推荐

  1. 创建并配置Filter

    创建Filter需要两个步骤: 创建FIlter处理类. web.xml文件中配置Filter. 创建Filter类 创建Filter必须实现javax.servlet.Filter接口,在该接口中定 ...

  2. Machine Learning 学习笔记 (2) —— 使用牛顿法寻找极值

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 用牛顿法解方程 牛顿法是一种 ...

  3. [uwp开发]数据绑定那些事(1)

    现在是msp候选人,是时候写点技术博客来加分了(实则是个人的心得体会). 注:以下都是个人理解,错误在所难免,欢迎批评指正 以前接触过WPF,只会简单的一些操作,现在在逐渐学习UWP(Universa ...

  4. USB硬件远程共享解决iphone已停用

    悲剧的在iphone拆过电池之后,再开机显示iphone已停用,请在23000000分钟后再试一次 算算这得45年了,可以留给孙子用了... 网上除了刷机和有同步过的电脑貌似没有别的办法了 因是旧系统 ...

  5. 团队项目的NABC

    我们团队项目是做一个基于PC端的截屏软件,我觉得一个好的截屏软件需要具备磁性吸附的功能.当你需要对某个图像或者是其他的什么截屏的时候,精度比较高,不需要那些边框外的东西,磁性吸附就是在你选中的时候尽管 ...

  6. 使用usb+preseed在virtualbox上安装ubuntu(一)

    1.制作usb boot盘,在ubuntu上使用startup disk creater将ubuntu-server12.04.iso写入到usb中: 2.修改syslinux文件夹中的syslinu ...

  7. 揭开NodeJS的神秘面纱!

    一.NodeJS是什么? Node是一个服务器端JavaScript解释器.Node.js是一套用来编写高性能网络服务器的JavaScript包. 二.Node的目标是什么? Node 公开宣称的目标 ...

  8. Gentoo 网络接口配置文件说明

    裁剪的Gentoo系统,仅供公司内部使用! [作为备份档案] 网络接口配置:/etc/conf.d/net #设置静态IPconfig_eth0="192.168.1.x/24" ...

  9. JavaScript 闭包详解

    一.Javascript闭包的用途 事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1.匿名自执行函数 我们知道所有的 ...

  10. Spring MVC mapping[From Spring MVC Beginner's Guide]

    In a Spring MVC application, the URL can logically be divided into five parts (see the following fig ...