3 条题解

  • 0
    @ 2023-12-31 9:30:46

    因为本题Q <= 10,所以可以考虑对于每一次查询,记录初始位置,如果下一次查询的结果=已知初始位置,则找出循环节 下面是本人的代码,可能有多余,但已经AC

    #include<bits/stdc++.h>

    using namespace std;

    const long long maxq = 100, maxn = 1e6 + 5; long long n, t, q, a[maxq], flag, sum[maxn], cnt, b, ans[maxn];

    int main() { long long i, j, num = 1;

    cin >> n >> t >> q;
    for(i = 1; i <= q; i++)
    {
    	cin >> a[i];
    }
    for(i = 1; i <= q; i++)
    {
    	j = a[i];
    	b = t;
    	cnt = 0;
    	memset(sum, 0, sizeof(sum));
    	memset(ans, 0, sizeof(ans));
    	num = 1;
    	while(1)
    	{
    		ans[num] = j;
    		num++;
    		sum[j]++;
    		if(sum[j] == 2)
    		{
    			break;
    		}
    		else
    		{
    			cnt++;
    		}
    		if(j % 2 == 0)
    		{
    			j = j / 2 + (n + 1) / 2;
    		}
    		else
    		{
    			j = j / 2 + 1;
    		}
    	}
    	b = b % cnt + 1;
    	cout << ans[b] << " ";
    }
    return 0;
    

    }

    信息

    ID
    1384
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    (无)
    递交数
    234
    已通过
    24
    上传者