POJ 2115 C Looooops (模线性方程)
来源:互联网 发布:怎么制作淘宝店招 编辑:程序博客网 时间:2024/05/17 04:32
坑点:
long long int mod = 1LL << k,否则会炸int。
题意:
给你A B C K四个变量,问你对于这样一个for循环在循环多少次之后跳出
for(int i = A ; i != B; i += c){
nothing;
}
注意这里对 i 的bit做了限制,只有k个bit,默认为无符号,也就是说
思路:
设次数为x,得到方程:
稍微变个形:
于是乎形如
关于模线性方程的通解:
形如这样的方程:
我们可以把他转化为:
首先判断是否有解,利用Bezout定理:若设a,b是整数,则存在整数x,y,使得
又因为
接着,根据
是不是感觉跟(1)有些像啊,所以咱们从这里入手,把(2)的左右同乘 b/d得到下式:
把(1)和(3)式一对比,哎呦我去,想要知道(1)式的x,我们只需知道(3)式的x’就够了。
dakala(所以)。。。
接着求x’就好了,,,
而怎么求x’呢?答案:扩展欧几里得算法。
根据式子(2)运用
扩展欧几里得算法:
lli x = 0,y = 0;lli e_gcd(lli a,lli b,lli &x,lli &y){ if(b == 0){ x = 1; y = 0; return a; } lli ans = e_gcd(b,a%b,x,y); lli temp = x; x = y; y = temp - a/b*y; return ans;}
但是这里又有个问题,解出来的x有可能是负的,而我们想要的是正的,所以还要进行一步操作:
有的童鞋可能要问了,这里为什么周期是n/d呢?请看(2)式,在这个式子里,如果d不等于1的话,左右两边是可以约分的,也就是说,周期并没有原来的n那么大,所以是n/d。
AC代码:
#include <iostream>#include <cstdio>#include <cmath>typedef long long int lli;using namespace std;lli x = 0,y = 0;lli e_gcd(lli a,lli b,lli &x,lli &y){ if(b == 0){ x = 1; y = 0; return a; } lli ans = e_gcd(b,a%b,x,y); lli temp = x; x = y; y = temp - a/b*y; return ans;}// ax = b (mod n)lli mod_line(lli a,lli b,lli n){ lli d = e_gcd(a,n,x,y); if(b % d == 0){ lli minx0 = (x * b / d) % n; return (minx0 % (n/d) + n/d)% (n/d); } else return -1;}int main(){ lli A,B,C,k; while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k),k){ lli status = mod_line(C,B-A,1LL<<k); if(status == -1){ puts("FOREVER"); } else{ printf("%I64d\n",status); } } return 0;}
1 0
- POJ 2115 C Looooops (模线性方程)
- Poj 2115 C Looooops (模线性方程)
- poj 2115 C Looooops(模线性方程)
- poj 2115 C Looooops (解模线性方程)
- poj-2115 C Looooops (单变元模线性方程)
- POJ 2115 C Looooops 模线性方程(扩展欧几里得)
- POJ 2115 C Looooops 解题报告(模线性方程)
- POJ 2115 C Looooops 解模线性方程(扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里德 + 求解模线性方程)
- [poj 2115]C Looooops[扩展欧几里德][模线性方程]
- poj 2115 C Looooops 拓展欧几里德 解模线性方程模板
- POJ 2115 C Looooops(单变元模线性方程)
- C Looooops--模线性方程
- [ACM] POJ 2115 C Looooops (扩展欧几里得求解模线性方程)
- pku 2115 C Looooops(解模线性方程)
- C Looooops(扩展欧几里得求模线性方程)
- poj2115——C Looooops(数论,解模线性方程)
- poj_2115 C Looooops(模线性方程+扩展欧几里得)
- sphinx的简单使用及yii中应用
- android 3
- 运行maven项目的步骤
- 《VR入门系列教程》之16---第一个OculusVR应用
- POJ 3592 Instantaneous Transference强连通加缩点后求最长路
- POJ 2115 C Looooops (模线性方程)
- 2016多校训练Contest8: 1008 Rikka with Sequence hdu5828
- 《VR入门系列教程》之17---发布第一个应用
- hdu 1035Robot Motion 搜索
- 1605 棋盘问题
- 《VR入门系列教程》之18---Oculus代码剖析
- 如何在物理隔离的服务器(red hat)中安装Jenkins
- 如何做一个简单的Guide(引导)页面
- DOM Ready探究