poj2115C Looooops
http://poj.org/problem?id=2115
参考人家的 如下
如i=65534,当i+=3时,i=1
其实就是 i=(65534+3)%(2^16)=1
有了这些思想,设对于某组数据要循环x次结束,那么本题就很容易得到方程:
x=[(B-A+2^k)%2^k] /C
即 Cx=(B-A)(mod 2^k) 此方程为 模线性方程,本题就是求X的值。
为了统一
令a=C
b=B-A
n=2^k
那么原模线性方程变形为:
ax=b (mod n)
该方程有解的充要条件为 gcd(a,n) | b ,即 b% gcd(a,n)==0
令d=gcd(a,n)
有该方程的 最小整数解为 x = e (mod n/d)
其中e = [x0 mod(n/d) + n/d] mod (n/d) ,x0为方程的最小解
那么原题就是要计算b% gcd(a,n)是否为0,若为0则计算最小整数解,否则输出FOREVER
据说。。
最小解 X=x*(B/d)%K;之后,为了保证X为最小正整数解需要做如下变换
(X+K)%(K/d)
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 #include<cmath> 6 #define LL long long 7 using namespace std; 8 LL exgcd(LL a,LL b,LL &x,LL &y) 9 { 10 if(b == 0) 11 { 12 x = 1; y = 0; return a; 13 } 14 LL d = exgcd(b, a % b,x,y); 15 LL temp = x; 16 x = y; 17 y = temp - a / b * y; 18 return d; 19 } 20 int main() 21 { 22 LL A,B,C,k; 23 while(cin>>A>>B>>C>>k) 24 { 25 if(!A&&!B&&!C&&!k) 26 break; 27 LL a = C; 28 LL b = B-A; 29 LL n = 1LL<<k; 30 LL x,y; 31 LL d = exgcd(a,n,x,y); 32 if(b%d!=0) 33 { 34 puts("FOREVER"); 35 continue; 36 } 37 x = x*(b/d)%n; 38 x = (x+n)%(n/d); 39 cout<<x<<endl; 40 } 41 return 0; 42 }
转载于:https://www.cnblogs.com/shangyu/archive/2013/02/19/2917724.html
poj2115C Looooops相关推荐
- POJ2115-C Looooops【扩欧,同余】
正题 链接: http://poj.org/problem?id=2115 大意 就是给出个循环 for(i=A;i!=B;i=(i+C)mod2k)for(i=A;i!=B;i=(i+C)mod2k ...
- NOI数学之提高级:初等数论
欧拉定理详解 欧拉定理详解_郝伟老师的博客--大数据.并行计算与人工智能时代-CSDN博客_欧拉定理 欧拉函数与欧拉定理 欧拉函数与欧拉定理_leader_one的博客-CSDN博客_欧拉定理 欧拉定 ...
- C Looooops POJ - 2115
C Looooops POJ - 2115 题目: A Compiler Mystery: We are given a C-language style for loop of type state ...
- [数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM
文章目录 C Looooops description solution code 跳跳棋 description solution code The Luckiest number descript ...
- poj 2115 C Looooops(扩展欧几里德算法)
题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...
- poj-2115 C Looooops(扩展欧几里得)
题解:c*x+a(mod 2^k) = b 化简得:c*x = b-a(mod 2^k) 求解一次同余式: 注意: b - a < 0的情况 #include<stdio.h> #i ...
- POJ 2115 C Looooops
被虐得很惨的一道题,WA了无数次,根据题意推出 C * x + (2 ^ k) * y = B - A,用拓展欧几里德求出x的最小值.如果无解则是死循环! /*Accepted 164K 0MS C+ ...
- POJ - 2115 C Looooops(扩展欧几里得)
题目链接:点击查看 题目大意:执行一个循环: for (variable = A; variable != B; variable += C) statement; 问在2的k次幂的范围内最少需要执行 ...
- POJ 2115 C Looooops(扩展欧几里得)
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % ...
最新文章
- SharePoint2013自定义登录页面
- Web services 安全实践: 基于 HTTP Basic Authentication 为 Web services 配置传输层安全机制...
- 【week3】psp (技术随笔)
- Linux下的进程概论与编程二(进程控制)
- php 模糊过滤字符串,PHP简单字符串过滤方法示例
- oracle未找到时区,Oracle ADF 未找到时区错误
- 如何在工作中快速成长?致工程师的10个技巧
- windows7更改开始菜单外观的方法
- asp.net checkboxlist绑定数据读取出来
- linux下播放wma格式,Ubuntu 20.04中使Rhythmbox支持WMA格式文件播放
- 91卫图助手下载器永久免费啦!!
- 在家如何下载各大权威数据库文献
- miui免root冻结,免root停用miui应用
- 暴力解决Centos6YUM下Loaded plugins: fastestmirror Determining fastest mirror和Could not retrieve mirro
- Fastjson1.2.47反序列化漏洞复现
- Visual Studio2019完全卸载方法
- SDX62出现WARNING: CPU: 0 PID: 8743 at net/netfilter/nf_nat_core.c:614 nf_nat_setup_info+0x8e4/0x900
- PKI技术原理(收集 整理 归纳)
- 2016微信抢红包助手及源码
- 黑板报首期(080527)优秀文章推荐
热门文章
- 一步步通过命令行cl.exe编译Windows程序
- linux下汇编语言开发总结
- 用虚拟机安装了红帽后,我确实没设置用户名密码,但现在一打开就让输入用户名密码。这种情况该怎么办??
- EndNote使用技巧之一--参考文献的导入
- 我是如何使用laydate日历插件更换掉老项目不好用的日历插件datepicker的
- ajax修改按钮的html值,ajax - 在yii 1中使用ajax根据选定的单选按钮选项更新html字段值 - 堆栈内存溢出...
- php实现标签云,php标签云的实现代码
- php与mysql连接程序_PHP与Mysql连接
- 国际站html代码,国际站必须看得懂的HTML代码
- 测试社交软件有哪些,性格测试:测你适合哪个社交平台