1 条题解

  • 0
    @ 2026-5-5 8:26:43

    解题思路

    如果我们直接模拟整个过程,会超时,因为 kk 太大。所以需要一些简单的观察:

    • 如果 nn 是偶数,那么每次操作中 nn 都会加上 22,并且始终保持偶数。
    • 如果 nn 是奇数,那么第一次操作会使 nn 加上一个奇数,之后 nn 变成偶数。

    因此,很容易看出答案如下:

    • nn 是偶数时:

      n+2kn + 2k
    • nn 是奇数时:
      d(n)d(n)nn 的最小正因子(除了 11 以外)。第一次操作后,nn 变为 n+d(n)n + d(n),这是一个偶数。之后剩余的 k1k-1 次操作,每次加上 22。因此:

      n+d(n)+2(k1)n + d(n) + 2(k - 1)

    其中 d(n)d(n) 可以在 O(n)O(\sqrt{n}) 时间内计算(实际实现中通常 O(n)O(n) 预处理,但这里每个 nn 单独计算也很快)。

    总复杂度为 O(n)O(n)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    	int T;
    	cin >> T;
    	while(T--)
    	{
    		int n,k;
    		cin >> n >> k;
    		if(n%2==0)
    		{
    			cout << n+2*k << endl;
    			continue;
    		}
    		int p = 0;
    		for(int i = n; i>=2; i--)
    			if(n%i==0)
    		    	p = i;
    		cout << n+p+2*(k-1) << endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6882
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者