Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle

原题链接Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cyclehttps://codeforces.com/contest/1487/problem/B

题目大意:有Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle段长度和AB两只猫。A猫从Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle点出发每次向前走一步,到达1之后重新回到n点(即:Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle),B猫从Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle点出发,每次向后走一步,到达n之后回到1点(即:Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle)但是A猫比B猫强壮,因此AB相遇时B会多向前走一步。问进行k此之后B猫的位置。

解题思路:

1、先想模拟,每次进行一次操作,但是给的数据的最坏时间是1e9 * 1e4,显然会超时。

2、发现n为偶数时,AB不可能会相遇,因为A的位置为奇数时B的位置必为偶数,反之也是。

3、每次相遇的步长为n/2,即每进行n/2次操作只有AB会相遇一次。

4、n为偶数时,B的位置为(k - 1)% n + 1;n为奇数时,B的位置为(k - 1 ) + (k - 1) / (n / 2)) % n + 1。

PS:Educational Codeforces Round 104 (Rated for Div. 2)B. Cat Cycle初始位置是从1开始的,要进行k - 1在对结果 + 1的操作,不然的话是从0开始递增。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MP make_pair
#define SZ(X) ((int)(X).size())
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
int main(){
    int T,n,k;
    scanf("%d",&T);
    while(T --){
        scanf("%d%d",&n,&k);
        if(n % 2 == 0) printf("%d\n",(k - 1) % n + 1);
        else printf("%d\n",((k - 1 ) + (k - 1) / (n / 2)) % n + 1);
    }
    return 0;
}

刚开始做的时候题目看错了,卡了半天QAQ。

上一篇:『解题报告』CF1602 (Codeforces Round #751 (Div. 1 + Div. 2))


下一篇:Codeforces Round #748 (Div. 3) 题解代码