#641 (Div. 2)A. Orac and Factors

题目描述

Orac is studying number theory, and he is interested in the properties of divisors.
For two positive integers a and b, a is a divisor of b if and only if there exists an integer c, such that a⋅c=b.
For n≥2, we will denote as f(n) the smallest positive divisor of n, except 1.
For example, f(7)=7,f(10)=2,f(35)=5.
For the fixed integer n, Orac decided to add f(n) to n.
For example, if he had an integer n=5, the new value of n will be equal to 10. And if he had an integer n=6, n will be changed to 8.
Orac loved it so much, so he decided to repeat this operation several times.
Now, for two positive integers n and k, Orac asked you to add f(n) to n exactly k times (note that n will change after each operation, so f(n) may change too) and tell him the final value of n.
For example, if Orac gives you n=5 and k=2, at first you should add f(5)=5 to n=5, so your new value of n will be equal to n=10, after that, you should add f(10)=2 to 10, so your new (and the final!) value of n will be equal to 12.
Orac may ask you these queries many times.

Input

The first line of the input is a single integer t (1≤t≤100): the number of times that Orac will ask you.
Each of the next t lines contains two positive integers n,k (2≤n≤106,1≤k≤109), corresponding to a query by Orac.
It is guaranteed that the total sum of n is at most 106.

Output

Print t lines, the i-th of them should contain the final value of n in the i-th query by Orac.

Example

input
3
5 1
8 2
3 4
output
10
12
12

Note

In the first query, n=5 and k=1. The divisors of 5 are 1 and 5, the smallest one except 1 is 5. Therefore, the only operation adds f(5)=5 to 5, and the result is 10.
In the second query, n=8 and k=2. The divisors of 8 are 1,2,4,8, where the smallest one except 1 is 2, then after one operation 8 turns into 8+(f(8)=2)=10. The divisors of 10 are 1,2,5,10, where the smallest one except 1 is 2, therefore the answer is 10+(f(10)=2)=12.
In the third query, n is changed as follows: 3→6→8→10→12.

题目大意

给出数n和k次操作,每次操作的方法:n=n+n除了1以外的最小因子。
求最后的n为多少。

题目分析

首先,我们可以发现:当n为偶数时,n的最小因子2,而(n+2)的最小因子也为2…所以,当n为偶数时,答案即为n+2*k
而当n为奇数时,它的最小因子也为奇数,因此n+n的最小因子后为偶数。于是也就转化为了偶数的情况。

代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <map>
#include <unordered_map>
#include <queue>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
int const N=1e5+5;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,k;
		cin>>n>>k;
		if(n%2==0)     //n为偶数的情况
		{
			cout<<n+2*k<<endl;
			continue;
		}
		int s;
		for(int i=3;i<=n;i++)  //n为奇数的情况
		if(n%i==0) 
		{
		    s=i;
		    break;
		} //第一次操作之后,n也就变为了偶数,所以可以再用偶数的情况处理剩下的k-1次操作
		cout<<n+s+(k-1)*2<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/li_wen_zhuo/article/details/106087026
今日推荐