讨论 / 本人2013年源程序
了解颤抖 2014-07-24 01:56:51
点我顶贴 收藏 删除
var

kk:int64;

x,k,n,m,ans,l:longint;

function find(x,kk:longint):longint;

var an:longint;

begin

if kk=0 then begin find:=x; exit; end;

an:=(find(x,kk-1)+m) mod n;

find:=an;

end;

function gcd(a,b:longint):longint;

begin if b=0 then begin gcd:=a; exit; end;

gcd:=gcd(b,a mod b);

end;

function lim(a,b:longint):longint;

var an:longint;

begin if a mod b=0 then exit(a);

an:=a*b div gcd(a,b);

exit(an);

end;

function get(a,b,c:longint):longint;

var an,num:longint;

begin

a:=a mod c;

an:=a; if b=1 then exit(an);

num:=1;

while num<b do

if b mod num=0 then begin an:=(an*an) mod c; num:=num*2; end

else begin an:=(an*a) mod c; num:=num+1; end;

exit(an);

end;

begin

assign(input,'circle.in');assign(output,'circle.out');

reset(input);rewrite(output);

readln(n,m,k,x);

{if k<=8 then if trunc(exp(ln(10)*k)) mod (n div m)=0 then begin writeln(x); close(input);

close(output); halt;

end; }

if n mod m=0 then l:=n div m

else l:=lim(n,m)div m;

kk:=get(10,k,l);

ans:=(find(x,kk)) mod n;

writeln(ans);

close(input);close(output);

end.

其实会发现这是有循环的,只用求得一个lcm与gcd,就可以知道这个循环最后的位置,但需要快速幂来获取最大次数,这样才能使用lcm与gcd,水题

#1 biantiao@2014-07-24 18:08:10
回复 删除
好讨厌一A完题就贴代码的行为
#2 一只小兲@2014-09-13 05:44:59
回复 删除
回复 #1 biantiao:+1
查看更多回复
提交回复