【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法
题意:给你一个分数,求它在二进制下的循环节的长度,还有第一个循环节从哪一位开始。
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 或 消因子+欧拉定理 两种方法相关推荐
- 两种方法筛选出多因子量化选股模型
多因子选股模型在模型搭建中,往往会涉及到非常多的股价影响因子,并可能导出数量极多的备选模型.因此,对于多因子选股模型的评价和筛选,就显得尤为关键. 对于专业的量化投资人而言,就需要进一步了解多因子选股 ...
- 初探多因子选股:单个因子的有效性检验
单因子有效性检验 在多因子研究框架中,因子的有效性检验是不可避免的工作,其本质是衡量一个因子的选股能力,以下介绍笔者日常学习过程中摘下的几种有效性检验方法,以供日后使用. 本文将介绍目前学术界和业界普 ...
- 怎么解决相位抵消_两种相位抵消法消侧音原理及其电路形式
摘要:为帮助正确理解及运用常见的消侧音电路,分别讨论了加法和减法电路实现的相位抵消法消侧音原理.几种典型电路均用到运算放大器.为直观认识每种电路的特点,估算了接收方获得信号和发送方输出信号的比值(电压 ...
- R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、并获取因子分数、因子得分系数(scoring coefficients)
R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.并获取因子分数.因子得分系数(factor scores.scoring ...
- minitab怎么算西格玛水平_16:三因子二水平全因子实验设计和MINITAB应用训练
16: 思慧慧咨询官网――精益生产.六西格玛黑带.绿带.TRIZ创新发明.实验设计DOE.价值工程.全面设备管理(TPM)培训和项目咨询www.sihuide.com 分享地址: 千聊入口1 htt ...
- 计算机科学的影响因子,影响因子最高的计算机科学期刊(前50种).doc
影响因子最高的计算机科学期刊(前50种) 影响因子最高的计算机科学期刊(前50种) RankAbbreviated Journal Title linked to full journal infor ...
- sci影响因子小于1计算机,影响因子小于1的期刊_影响因子_柳叶刀影响因子多少...
SCI影响因子多少算高? 影响因子越高越好,因为直接代表你的论文在业界的影响力,代表有多少的权威性.SCI影响因子计算方式: 计算方法:出版当年之前两年该期刊在当年被引用次数总和÷前两年该期刊出版文献 ...
- 华泰单因子测试之换手率类因子
一.因子选择 二. 因子收益 1)绘制各分位数各周期的平均收益(收益数值不是重点,主要用于观察是否具有单调性) #绘制各分位数各周期的平均收益(收益数值不是重点,主要用于观察是否具有单调性) plot ...
- 华泰单因子测试之估值类因子(回归法)
IC值 1.计算每日因子IC值 ic_date = pe_factor.calc_factor_information_coefficient(group_adjust=0, by_group=0, ...
最新文章
- 终于搞懂了sleep/wait/notify/notifyAll
- redis:RDM连接阿里云redis服务器
- Asp.Net函数集
- VideoLAN,VLC和FFmpeg社区联合开发AV1解码器
- 前端学习(3209):react中类中方法的this指向
- 论文浅尝 - EMNLP2020 | 低资源跨语言实体链接中的设计挑战
- linux系统是微内核结构,科普:微内核操作系统现状
- 页面跳转失效_网站的404页面对于SEO的重要作用
- 类库、委托、is/as
- springmvc中常见的简单的文件上传和下载
- 新中大如何修改服务器地址,新中大GE10.0安装配置手册
- Alexa Voice Server 实现的 Android APK 聊天机器人
- 微信公众号里面使用定位
- python建站部署_2个Python学习网站制作教程
- mac 修改 DNS
- 基于 FPGA 的飞机大战游戏系统设计
- 用 django 构建翻译网站——软件工程课程设计
- 【论文阅读笔记】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- 【螺旋旋转爱心特效】(Html+JS+CSS+效果+全部源代码)
- http://blog.csdn.net/cs_lht?viewmode=contents
热门文章
- vue watch 经常监听不到_Vue.js中 watch(深度监听)的最易懂的解释
- docker镜像指定安装源_Docker快速安装以及换镜像源
- 这就是数据分析之数据变换
- 解析Tensorflow官方PTB模型的demo
- 自动驾驶计算本车离期望轨迹距离的方法
- mysql 查询视图是否存在_sql server判断数据库、表、列、视图是否存在
- linux挂载iso镜像进系统,linux可以加载iso镜像文件到启动项吗
- 设置linearlayout最大高度_ICEM CFD网格设置参数意义
- 华为鸿蒙3799跟4799有啥区别,华为鸿蒙智慧屏出世!3799元高价,是增智慧还是智商税?...
- 系统无法执行指定的程序。_使用Rust编写操作系统(一):独立式可执行程序