UVA.12169 Disgruntled Judge ( 拓展欧几里得 )

题意分析

给出T个数字,x1,x3……x2T-1。并且我们知道这x1,x2,x3,x4……x2T之间满足xi = (a * xi-1 + b ) MOD 10001, 求出x2,x4……x2T.

由于本题中的a和b是未知的,所以需要根据已知条件求出a和b,据说有人暴力枚举a和b然后过了。 所以我来换另一种方法。

其实我们可以枚举a,并根据x1,x3算出求出可行的b的值。如何做到呢?

首先我们已经知道

x2 = (a * x1 + b) MOD 10001

x3 = (a * x2 + b) MOD 10001

于是就可以把第一个式子带入到第二个式子中,消去x2,进而得到

x3 = ( a * (a * x1 + b) + b ) MOD 10001

而这个式子,可以进一步转化为

思考一下为什么,等式左边是10001 * k + x3, 对10001 取模后,不就是x3吗? 一开始没有想到,要熟记这个转化!

对于式子x3 + 10001 * k = ( a * (a * x1 + b) + b ) ,继续稍作化简,可以得到

(a+1) * b - 10001 * k = x3 - a * a * x1

而这个式子,就可以用拓展欧几里得算法,求得一组可行解(b,k),我们比较关心的是b的值,在计算完成之后,要记得检验 (x3 - a * a * x1) / gcd( (a+1),10001) 是否为整数,若是的话,就说明这对(a,b) 对于x1,x3是可行的。

然而题目还给出了x5……等等的奇数序列,我们在依次递推的时候,若发现求出的x5,x7……与原数列不相等,那么说明求出的(a,b)并不work,还要重新求解,题目保证一定有解。

代码总览

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll long long
#define nmax 220
#define MOD 10001
using namespace std;
ll a,b,k,c,d;
int n;
ll x[nmax];
void exgcd(ll a, ll b, ll& d, ll& x, ll &y){
if(!b){
d = a,x = 1,y = 0;
}else{
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
bool solve(){
c = x[3] - a*a*x[1];
exgcd(a+1,MOD,d,b,k);
if(c % d == 0){
b = c / d * b;
return true;
}
else return false; }
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n) != EOF){
for(int i =1;i<=2*n;i+=2) scanf("%lld",&x[i]);
bool isfindall = false;
for( a = 0;a < MOD;++a){
if(solve()){
for(int j = 2;j<=2*n;++j){
isfindall = false;
ll tmp = ( (a * x[j-1]) + b)%MOD;
if( (j%2!=0) && tmp != x[j]) break;
else x[j] = tmp;
if(j == 2*n) isfindall = true;
}
if(isfindall) break;
}
}
for(int i = 2;i<=2*n;i+=2){
printf("%lld\n",x[i]);
}
}
return 0;
}

UVA.12169 Disgruntled Judge ( 拓展欧几里得 )的更多相关文章

  1. UVA 12169 Disgruntled Judge 扩展欧几里得

    /** 题目:UVA 12169 Disgruntled Judge 链接:https://vjudge.net/problem/UVA-12169 题意:原题 思路: a,b范围都在10000以内. ...

  2. hdu 2769 uva 12169 Disgruntled Judge 拓展欧几里德

    //数据是有多水 连 10^10的枚举都能过 关于拓展欧几里德:大概就是x1=y2,y1=x2-[a/b]y2,按这个规律递归到gcd(a,0)的形式,此时公因数为a,方程也变为a*x+0*y=gcd ...

  3. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  4. UVa 12169 Disgruntled Judge 紫书

    思路还是按照紫书,枚举a,得出b, 然后验证. 代码参考了LRJ的. #include <cstdio> #include <iostream> using namespace ...

  5. UVa 12169 - Disgruntled Judge(拓展欧几里德)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. UVA 12169 Disgruntled Judge【扩展欧几里德】

    题意:随机选取x1,a,b,根据公式xi=(a*xi-1+b)%10001得到一个长度为2*n的序列,奇数项作为输入,求偶数项,若有多种,随机输出一组答案. 思路:a和b均未知,可以考虑枚举a和b,时 ...

  7. UVA 12169 Disgruntled Judge

    我该怎么说这道题呢...说简单其实也简单,就枚举模拟,开始卡了好久,今天看到这题没a又写了遍,看似会超时的代码交上去a了,果然实践是检验真理的唯一标准... #include <iostream ...

  8. UVA 12169 Disgruntled Judge(Extended_Euclid)

    用扩展欧几里德Extended_Euclid解线性模方程,思路在注释里面了. 注意数据范围不要爆int了. /********************************************* ...

  9. uva 10548 - Find the Right Changes(拓展欧几里得)

    题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...

随机推荐

  1. Hyperledger Fabric CA User’s Guide——开始(三)

    Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...

  2. js传输txt文档内容

    要求:实现修改text文档内容,即可将text修改内容传到页面显示: HTML: <!doctype html> <html lang="en"> < ...

  3. 【quickhybrid】组件(自定义)API的实现

    前言 前文在API规划时就已经有提到过组件API这个概念,本文将会介绍它的原理以及实现 理解组件API这个概念 quick.ui.xxx quick.page.xxx 在quick hybrid中,A ...

  4. Final发布:文案+美工展示博客

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2476 小组介绍 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 段 ...

  5. 在写ssh项目时浏览器页面出现http status 404 – not found

    HTTP Status 404 - /streetManager/index.jsp type Status report message /streetManager/index.jsp descr ...

  6. Microsoft Visual Studio 2013 的安装及单元测试

    题目:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂. 安装过程: 1.下 ...

  7. 关于httpServlet.service()步骤

    关于httpServlet.service()步骤 关于()方法 1.HTTP Servlet 使用一个 HTML 表格来发送和接收数据.要创建一个 HTTP Servlet,就需要扩展 HttpSe ...

  8. 寒假学习计划&进度

    学习计划 c语言查缺:这方面的查缺,我觉得我不需要花较多时间,因为老师上课讲的也足够详细,自己学的也自认为没有太多疏漏,所以我假期学习的中心放在了c++上面. c++学习:开始我先看了几集师爷的视频, ...

  9. Alpha版本冲刺(五)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  10. C++获取private的变量-偷走private

    private提供了对数据的封装,使得private成员只能被类自身的成员函数以及类的友元访问,其他的函数或者类想要访问private成员只能通过该类所提供的set和get的方法进行访问, 或者返回其 ...