Stay Hungry,Stay Foolish!

D - Marking

D - Marking

https://atcoder.jp/contests/abc290/tasks/abc290_d

 

思路

 

 

 https://zhuanlan.zhihu.com/p/607818729

x即为最小循环节的长度

即经过x次mark, mark的位置又回到了 0 位置。


如下为x最小循环的推导。

 

 

第k次所处的位置 由两部分决定

(1)k次所处在第几个循环节 loop_times = k / x

(2)k次所处第一个循环节内部相对位置 offset = k % x

   此相对位置对应的实际位置 = offset * D, 

    offset为循环节内,第几次移动, 每移动一次要在当前位置上加上D

    所以实际位置 = offset * D

    为了避免溢出 需要 % n

 

k次实际位置 = loop_time + offset*D%n = k / x + (k % x)*D%n

第一循环节内的实际位置 0, D, 2D,... xD

第二循环节内的实际位置 0+1, D+1, 2D+1,... xD+1

。。。。。

 

reference:

https://atcoder.jp/contests/abc290/submissions/39016002

Code

https://atcoder.jp/contests/abc290/submissions/39219152

int t;
 
int main()
{
    cin >> t;
 
    REP(i, t){
        int n, d, k;
 
        cin >> n >> d >> k;
 
        k--;
 
        long long nd_gcd = __gcd(d, n);
 
        long long l = n / nd_gcd;
        
        long long loop_pos = (k%l) * d % n;
        
        long long loop_times = k / l;
        
        cout << loop_pos + loop_times << endl;
    }
 
    return 0;
}
 

 

posted @ 2023-02-26 17:50  lightsong  阅读(27)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel