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,水题