d.对于这个循环,

for (variable = A; variable != B; variable += C)

statement;

给出A,B,C,求在k位存储系统下的循环次数。

例如k=4时,变量variable则只在0~15之间循环变化。

s.扩展欧几里德求解模线性方程(线性同余方程)。

设循环次数为x,

1.(A+C*x)mod 2^k=B. --> C*x=B-A(mod 2^k). (怎么变来的?)

2.C*x=B-A(mod 2^k). --> C*x+(2^k)*y=B-A.

扩展欧几里德求:C*x+(2^k)*y=gcd(C,2^k)=d.(原式:a*x+b*y=gcd(a,b)=d,以下a代表C,b代表2^k。)

如果(B-A)mod d==0(也就是(B-A)的值可以整除d,貌似表示为d|(B-A)?),则原方程C*x+(2^k)*y=B-A.的解为x'=x*((B-A)/d)。

3.利用周期性变化,求出最小的非负整数解为x''=(x'%(b/d)+(b/d))%(b/d).

因为:如果C*x+(2^k)*y=B-A.的一组整数解为(x1,y1),则它的任意整数解为(x1+k*(b/d)),y1-k*(a/d)).(k取任意整数)

(1)x'%(b/d),使解在(-b/d,b/d)

(2)+(b/d),使解在(0,2*b/d)

(3)%(b/d),得到最小整数解

为什么b/gcd(a,b),a/gcd(a,b)分别为x,y的解的最小间距?

解:假设c为x的解的最小间距,此时d为y的解的间距,所以x=x0+c*t,y=y0-d*t(x0,y0为一组特解,t为任意整数)

带入方程得:a*x0+a*c*t+b*y0-b*d*t=n,因为a*x0+b*y0=n,所以a*c*t-b*d*t=0,t不等于0时,a*c=b*d

因为a,b,c,d都为正整数,所以用最小的c,d,使得等式成立,ac,bd就应该等于a,b的最小公倍数a*b/gcd(a,b),

所以c=b/gcd(a,b),d就等于a/gcd(a,b)。

若最后所求解要求x为最小整数,那么x=(x0%(b/gcd(a,b))+b/gcd(a,b))%(b/gcd(a,b))即为x的最小整数解。

x0%(b/gcd(a,b))使解落到区间-b/gcd(a,b)~b/gcd(a,b),再加上b/gcd(a,b)使解在区间0~2*b/gcd(a,b),

再模上b/gcd(a,b),则得到最小整数解(注意b/gcd(a,b)为解的最小距离,重要

c.

#include<iostream>
#include<stdio.h>
using namespace std; //返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y){
if(a==&&b==)return -;//无最大公约数
if(b==){x=;y=;return a;}
long long d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
} //求逆元
//ax=1(mod n)
long long mod_reverse(long long a,long long n){
long long x,y;
long long d=extend_gcd(a,n,x,y);
if(d==)return (x%n+n)%n;
else return -;
} int main(){ long long A,B,C,k;
long long a,b,x,y;
long long d; while(~scanf("%lld%lld%lld%lld",&A,&B,&C,&k)){ if(A==&&B==&&C==&&k==)break; a=C;
b=((long long))<<k;
d=extend_gcd(a,b,x,y); if((B-A)%d==){
x=(x*((B-A)/d))%b;
x=(x%(b/d)+(b/d))%(b/d);
printf("%lld\n",x);
}
else{
printf("FOREVER\n");
}
}
return ;
}

ps:题解可以参考这个:http://www.cnblogs.com/My-Sunshine/p/4828600.html 当时就是看这个才懂的

POJ - 2115 C Looooops(扩展欧几里德求解模线性方程(线性同余方程))的更多相关文章

  1. POJ2115——C Looooops(扩展欧几里德+求解模线性方程)

    C Looooops DescriptionA Compiler Mystery: We are given a C-language style for loop of type for (vari ...

  2. poj 2115 C Looooops 扩展欧几里德

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23616   Accepted: 6517 Descr ...

  3. POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

    分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转 ...

  4. POJ 2115 C Looooops扩展欧几里得

    题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...

  5. POJ 2115 C Looooops(扩展欧几里得应用)

    题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...

  6. POJ 2115 C Looooops(扩展欧几里得)

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...

  7. poj 2115 C Looooops(扩展gcd)

    题目链接 这个题犯了两个小错误,感觉没错,结果怒交了20+遍,各种改看别人题解,感觉思路没有错误,就是wa. 后来看diccuss和自己查错,发现自己的ecgcd里的x*(a/b)写成了x*a/b.还 ...

  8. POJ 2115 C Looooops(模线性方程)

    http://poj.org/problem?id=2115 题意: 给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER. 思 ...

  9. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

随机推荐

  1. 跳蚤 BZOJ 4310

    跳蚤 [问题描述] 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最 ...

  2. [Python] 'unicode' object is not callable

    在Python中,出现'unicode' object is not callable的错误一般是把字符串当做函数使用了.

  3. Scrapy学习-6-JSON数据处理

    使用json模块处理JSON数据 class JsonwithEncodingPipeline(object): def __init__(self): self.file = codecs.open ...

  4. Hibrenate load 和 get

    这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别(Hibernate 3以后的版本就用get()方法取代find()这个方法了),其实这个在网上有很多的论述 ...

  5. delphi使用IdHTTP模拟提交页面方法总结

    http://blog.csdn.net/lxdcyh/article/details/3986800 1.拖入TIdHTTP控件,HandleRedirect设为True,否则可能会出现HTTP 3 ...

  6. Codeforces 515E Drazil and Park (ST表)

    题目链接 Drazil and Park 中文题面 传送门 如果他选择了x和y,那么他消耗的能量为dx + dx + 1 + ... + dy - 1 + 2 * (hx + hy). 把这个式子写成 ...

  7. 洛谷P1352 没有上司的舞会

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  8. spark与Scala安装过程和步骤及sparkshell命令的使用

    Spark与Scala版本兼容问题: Spark运行在Java 8 +,Python 2.7 + / 3.4 +和R 3.1+上.对于Scala API,Spark 2.4.2使用Scala 2.12 ...

  9. nuxt.js 加百度统计

    Mark一下: 在 Nuxt.js应用中使用Google统计分析服务,或者百度统计分析服务,推荐在 plugins 目录下创建 plugins/ga.js 文件.统计统计分析我们可以获取网站pv,uv ...

  10. Python机器学习--回归

    线性回归 # -*- coding: utf-8 -*- """ Created on Wed Aug 30 19:55:37 2017 @author: Adminis ...