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

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的:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8
 9 typedef long long LL;
10 const LL N=40000;
11 LL pl,bl;
12 LL p[N];
13 bool vis[N];
14 struct node{
15     LL d,id;
16 }bit[N];
17
18 bool cmp(node x,node y){
19     if(x.d==y.d) return x.id<y.id;
20     return x.d<y.d;
21 }
22
23 LL exgcd(LL a,LL b,LL &x,LL &y)
24 {
25     if(b==0) {x=1,y=0;return a;}
26     LL tx,ty;
27     LL d=exgcd(b,a%b,tx,ty);
28     x=ty;y=tx-(a/b)*ty;
29     return d;
30 }
31
32 LL find(LL x)
33 {
34     int l=1,r=bl;
35     while(l<=r)
36     {
37         int mid=(l+r)>>1;
38         if(bit[mid].d==x) return bit[mid].id;
39         if(bit[mid].d<x) l=mid+1;
40         if(bit[mid].d>x) r=mid-1;
41     }
42     return -1;
43 }
44
45 void exBSGS(LL b,LL &xx,LL &yy)
46 {
47     LL t,m,g,x,y,pm,am;
48     while(b%2==0) {b/=2;xx++;}
49     t=2;
50     for(int i=1;i<=100;i++)
51     {
52         if(t%b==1) {yy=i;return ;}
53         t=t*2%b;
54     }
55     m=(LL)(ceil((double)sqrt((double)b)));
56     pm=1%b;bit[0].d=1%b;bit[0].id=0;
57     for(int i=1;i<=m;i++)
58     {
59         bit[i].d=bit[i-1].d*2%b;
60         bit[i].id=i;
61         pm=pm*2%b;
62     }
63     sort(bit+1,bit+1+m,cmp);
64     bl=1;
65     for(int i=2;i<=m;i++)
66     {
67         if(bit[i].d!=bit[bl].d) bit[++bl]=bit[i];
68     }
69     exgcd(pm,b,x,y);
70     am=x%b+b;
71     t=1%b;
72     for(int i=0;i<=m;i++)
73     {
74         x=find(t);
75         if(x!=-1) {yy=i*m+x;return ;}
76         t=t*am%b;
77     }
78     return ;
79 }
80
81 int main()
82 {
83     freopen("a.in","r",stdin);
84     freopen("b.out","w",stdout);
85     LL T=0,a,b;
86     char c;
87     while(scanf("%I64d%c%I64d",&a,&c,&b)!=EOF)
88     {
89         LL x,y;
90         LL g=exgcd(a,b,x,y);
91         a/=g,b/=g;
92         x=1,y=-1;
93         exBSGS(b,x,y);
94         printf("Case #%I64d: %I64d,%I64d \n",++T,x,y);
95     }
96     return 0;
97 }

欧拉定理的:

#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+100;
LL fl;
LL f[N];LL gcd(LL a,LL b)
{if(b==0) 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=2;i*i<=x;i++){if(x%i==0) ans/=i,ans=ans*(i-1);while(x%i==0) x/=i;}if(x>1) ans/=x,ans=ans*(x-1);return ans;
}LL quickpow(LL a,LL b,LL mod)
{LL ans=1%mod;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}void solve(LL b,LL &xx,LL &yy)
{LL k=2,x=b,ans=x;while(b%2==0) xx++,b/=2;LL phi=eular(b);for(int i=1;i*i<=phi;i++){if(phi%i==0) f[++fl]=i,f[++fl]=phi/i;}sort(f+1,f+1+fl,cmp);for(int i=1;i<=fl;i++){if(quickpow(2,f[i],b)==1) {yy=f[i];return ;}}
}int main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout);LL T=0,a,b;char c;while(scanf("%I64d%c%I64d",&a,&c,&b)!=EOF){LL x=1,y=0;LL g=gcd(a,b);a/=g,b/=g;solve(b,x,y);printf("Case #%I64d: %I64d,%I64d \n",++T,x,y);}return 0;
}

转载于:https://www.cnblogs.com/KonjakJuruo/p/5611523.html

【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法相关推荐

  1. 两种方法筛选出多因子量化选股模型

    多因子选股模型在模型搭建中,往往会涉及到非常多的股价影响因子,并可能导出数量极多的备选模型.因此,对于多因子选股模型的评价和筛选,就显得尤为关键. 对于专业的量化投资人而言,就需要进一步了解多因子选股 ...

  2. 初探多因子选股:单个因子的有效性检验

    单因子有效性检验 在多因子研究框架中,因子的有效性检验是不可避免的工作,其本质是衡量一个因子的选股能力,以下介绍笔者日常学习过程中摘下的几种有效性检验方法,以供日后使用. 本文将介绍目前学术界和业界普 ...

  3. 怎么解决相位抵消_两种相位抵消法消侧音原理及其电路形式

    摘要:为帮助正确理解及运用常见的消侧音电路,分别讨论了加法和减法电路实现的相位抵消法消侧音原理.几种典型电路均用到运算放大器.为直观认识每种电路的特点,估算了接收方获得信号和发送方输出信号的比值(电压 ...

  4. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、并获取因子分数、因子得分系数(scoring coefficients)

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.并获取因子分数.因子得分系数(factor scores.scoring ...

  5. minitab怎么算西格玛水平_16:三因子二水平全因子实验设计和MINITAB应用训练

    16: 思慧慧咨询官网――精益生产.六西格玛黑带.绿带.TRIZ创新发明.实验设计DOE.价值工程.全面设备管理(TPM)培训和项目咨询​www.sihuide.com 分享地址: 千聊入口1 htt ...

  6. 计算机科学的影响因子,影响因子最高的计算机科学期刊(前50种).doc

    影响因子最高的计算机科学期刊(前50种) 影响因子最高的计算机科学期刊(前50种) RankAbbreviated Journal Title linked to full journal infor ...

  7. sci影响因子小于1计算机,影响因子小于1的期刊_影响因子_柳叶刀影响因子多少...

    SCI影响因子多少算高? 影响因子越高越好,因为直接代表你的论文在业界的影响力,代表有多少的权威性.SCI影响因子计算方式: 计算方法:出版当年之前两年该期刊在当年被引用次数总和÷前两年该期刊出版文献 ...

  8. 华泰单因子测试之换手率类因子

    一.因子选择 二. 因子收益 1)绘制各分位数各周期的平均收益(收益数值不是重点,主要用于观察是否具有单调性) #绘制各分位数各周期的平均收益(收益数值不是重点,主要用于观察是否具有单调性) plot ...

  9. 华泰单因子测试之估值类因子(回归法)

    IC值 1.计算每日因子IC值 ic_date = pe_factor.calc_factor_information_coefficient(group_adjust=0, by_group=0, ...

最新文章

  1. mysql 硬解析 软解析_ORACLE sql语句的硬解析与软解析(收藏)
  2. 珠海网络推广浅析该如何高效的提高搜索引擎的抓取频次?
  3. 使用Spring框架开发会遇到的所有异常及解决方案(持续更)
  4. SpringMVC 参数解析器
  5. 辉瑞公司CEO:正在研发耐高温新冠疫苗
  6. 想从事 DBA 工作,该挑选哪一款数据库产品【转载+整理】
  7. mysql win linux性能对比,不同系统上 MySQL 的性能对比
  8. 前端开发-jQuery基本语法
  9. Applese 涂颜色(python解法)
  10. 在windows下把txt文件改为utf8格式
  11. 中仪股份管道机器人_中仪股份_X5-HW_管道检测机器人
  12. 网络攻击知识之几种IP地址攻击方式
  13. QT 程序运行异常问题总结
  14. ImageNet和COCO数据集分类
  15. ubuntu安装截图软件shutter
  16. Hibernate Transformers之三种结果转换说明
  17. Linux安装和使用Saturn
  18. 【Scikit-Learn 中文文档】流形学习 - 监督学习 - 用户指南 | ApacheCN
  19. Origin日常学习笔记1——绘制图形细节
  20. Happens-Before原则(先行发生原则)

热门文章

  1. 深度学习与TensorFlow:FCN论文学习笔记
  2. 用html5点击消失,input点击后placeholder中的提示消息消失
  3. Python ID 生成(UUID、自增、19位雪花算法ID)
  4. php 数组改成索引数组_PHP 自定义集合与数组规范
  5. 系统集成项目管理工程师考试大纲第二版
  6. python元组添加元素_2分钟学会Python的元组使用
  7. display:inline-block,block,inline的区别与用法
  8. 搭建自己的博客(二十六):优化点赞功能,并添加模态登录框
  9. Pinpoint 监控
  10. set和muliset