注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

z55250825

一只蒟蒻

 
 
 

日志

 
 

【数论复习】【清帝之惑康熙】  

2013-10-28 11:08:27|  分类: AC题目 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    上午把线性方程复习了一遍,算导上的群论十分的详尽,
    这题的做法很简单,就是求未知数为d的方程 x+md=y+nd(mod l)化简得 (m-n)d=y-x(mod l)
    我们可以在两边的系数加上L再模L就可以取正了,显然可以证明这样子对方程无影响,然后先欧几里得公倍数,判断y-x 是否可以除以公倍数,否的话方程无解(群论上可证在Zn群上a的生成群就等于gcd(a,n)的生成群,也就是说b要是原方程的一个解,就必须存在于gcd(a,n)生成群上,也就是说必须整除gcd(a,n)才行。)然后直接上扩展欧几里得求出 ax=gcd(a,l)(mod l)的解,则原方程的一个解为 x0=x*(b div gcd(a,l))( 证明:ax0=a*x*(b div gcd(a,l))=gcd(a,l)*b div gcd(a,l)=b )
      但这并不是题目所要求的最小整数解,我们依然可以用群论证明最小解在1~ n/gcd(a,n)里(因为 a^(i)=a^(j),当且仅当 
i=j(mod ord(a)),所以最小解在ord(a)里面,而ord(a)=ord(gcd(a,n))=n/gcd(a,n)),然后解的通项为
    x0+i*(n/gcd(a,n)),求的在这个区间里面的 X输出即可。

program kangxi;
var x,y,m,n,l:int64;

function gcd(a,b:int64):int64;
begin
  if b=0 then exit(a);
  exit(gcd(b,a mod b));
end;

procedure exgcd(a,b:int64;var x,y:int64);
var s,t:int64;
begin
  if b=0 then begin x:=1;y:=0;exit;end;
  exgcd(b,a mod b,s,t);
  x:=t;
  y:=s-(a div b)*t;
end;

procedure init;
begin
  read(x,y,m,n,l);
end;

procedure main;
var a,b,u,v,w:int64;
begin
  a:=m-n;
  b:=y-x;
  a:=(a+l)mod l;
  b:=(b+l)mod l;
  w:=gcd(a,l);
  if b mod w<>0 then begin write('Impossible');exit;end;
  exgcd(a,l,u,v);
  u:=(u*(b div w))mod l;
  if u<0 then u:=(u+l*((-u) div l+1))mod l;//因为L是 L/gcd(a,l)的一个倍数,这里只要把它变成整数,可以这样用
  if u-(l div w)>0 then u:=u mod (l div w);
  write(u);
end;

begin
  init;
  main;
end.

  评论这张
 
阅读(54)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018