博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【poj 2115】C Looooops(数论--拓展欧几里德 求解同余方程 模版题)
阅读量:6830 次
发布时间:2019-06-26

本文共 1622 字,大约阅读时间需要 5 分钟。

题意:有一个在k位无符号整数下的模型:for (variable = A; variable != B; variable += C)  statement; 问循环的次数,若“永不停息”(←_←)*,就输出"FOREVER"。

解法:用拓展欧几里德方法求出gcd最大公因数,再利用同余性质转化,求同余方程,或者不定方程。其中题目可化为 a+cx=b(mod 2^k) → cx=b-a(mod 2^k),求最小正整数解。也是求解同余方程。

   先将方程化为一般形式:ax=c(mod p) →  ax+py=c 。若 gcd(a,p)|c,就可以利用 ax+py=gcd(a,b)(mod p) [一般没有mod p] ,再把变量 x,y 乘上 c/gcd(a,b) 就是答案了。而要求最小正整数解,就是根据 ax+py=gcd(a,p) → a(x+p/gcd(a,p))+p(y-a/gcd(a,p)=gcd(a,p) ,所有的 x' 都满足 x+p/gcd(a,p) 来进行调整,并且取模。因为 每对 x 与 x' 都相差 p/gcd(a,p),那么根据同余的定义,x 和 x' 关于模 p/gcd(a,p) 同余,所以可以一直取模来调整。而对于 p/gcd(a,p) ,为正时取模才有保证最非负的意义。

注意——位运算超过30位时,尽管变量为long long,也要在之前加上强制转型(long long)。见代码的24行......之前我一次比赛,数组初始化是long long类型的,也要在数字后面加上"LL"或" l l "。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 typedef long long LL; 7 8 LL mabs(LL x) {
return x>0?x:-x;} 9 LL exgcd(LL a,LL b,LL& x,LL& y)10 {11 if (!b) {x=1,y=0; return a;}12 LL d,tx,ty;13 d=exgcd(b,a%b,tx,ty);//bx'+(a%b)y'=1(mod p)14 x=ty,y=tx-(a/b)*ty;//ay'+b(x'-t*y')=1(mod p)15 return d;16 }17 int main()18 {19 LL aa,bb,cc,pp;20 while (1)21 {22 scanf("%I64d%I64d%I64d%I64d",&aa,&bb,&cc,&pp);23 if (!aa && !bb && !cc && !pp) break;24 LL a=cc,b=(LL)1<
<
cx+2^k*y=b-a-->gcd(c,2^k)=1才有解26 d=exgcd(a,b,x,y);27 if (c%d!=0) printf("FOREVER\n");28 else29 {30 x=(x*(c/d))%p;//ax+by=c(mod p)的解31 LL t=mabs(b/d);32 x=(x%t+t)%t;//最小非负整数解33 if (!x) x+=t;//为0时要调整 34 printf("%I64d\n",x);35 }36 }37 return 0;38 }

 

转载于:https://www.cnblogs.com/konjak/p/6062524.html

你可能感兴趣的文章
[每日一题] 11gOCP 1z0-053 :2013-10-12 RESULT_CACHE在哪个池?.............................44
查看>>
Unity物理系统的触发器
查看>>
mysql慢查询日志相关参数
查看>>
项目中如果管理前端文件CSS和JS
查看>>
13 jsp include
查看>>
Nginx和PHP-FPM的启动、重启、停止脚本分享(转)
查看>>
如何拷贝CMD命令行文本到粘贴板
查看>>
Oracle数据库—— 存储过程与函数的创建
查看>>
兼容iOS 10 资料整理笔记
查看>>
逻辑回归原理小结
查看>>
php 7.0 安装以及老版本php删除
查看>>
【Machine Learning】决策树案例:基于python的商品购买能力预测系统
查看>>
【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-5 底层驱动之旋转编码器
查看>>
[Erlang]Erlang经常使用工具解说
查看>>
PHP:第五章——字符串编码函数
查看>>
What the difference between __weak and __block reference?
查看>>
【Linux 驱动】Netfilter/iptables (八) Netfilter的NAT机制
查看>>
python模块之psutil详解
查看>>
Nexus搭建Maven私服
查看>>
linux之misc及使用misc创建字符设备
查看>>