JZOJ 4909 【NOIP2017模拟12.3】李龟下棋

李龟下棋

题目大意

给出一个棋盘,棋盘是一个长度为 n 的序列,期初第 a 个位置和第 b 个位置,现在有两个人轮流下棋,如果第 k 个位置可以下棋,则满足以下两个条件之一:
k = i + j 或者 k = |i - j|
其中第 i , j 个位置上都放了棋子,谁先不能下棋谁就输,现在给出 n , a , b ,求哪一个人会输。(第一个人先手)

数据范围

n <= 1018

题解

这题看上去很难,实际上很简单。
首先,只要是 Gcd ( a , b )的倍数的格子都会被放上棋子,接下来问题就迎刃而解了。

Code(Pascal)

var
    t,a,b,n:int64;
    i:longint;
function gcd(a,b:int64):int64;
    begin
        repeat
            gcd:=a mod b;
            a:=b;
            b:=gcd;
        until gcd=0;
        exit(a);
    end;
begin
    readln(t);
    for i:=1 to t do
    begin
        readln(n,a,b);
        if (n div gcd(a,b)) mod 2=0 then writeln('1')
        else writeln('2');
    end;
end.

你可能感兴趣的:(gcd)