描述
从前有个数学函数f(x),功能是计算x的因数的个数,例如f(8)=4。(因为8的因数有1、2、4、8)
后来有人觉得算一次f函数不过瘾,又嵌套了一层,于是变成了f(f(x)),那么f(f(8))=f(4)=3。
随后,就有了更多层的嵌套函数f。人们发现这样写太费事了,于是把嵌套层数当成了f函数的第二个参数,例如f(f(8))写成了f(8,2),f(9)写成了f(9,1)。
现在,需要计算f(a,b)=?
输入
一个正整数n,表示有n组案例。
每组案例由两个正整数a、b组成。(a<=10亿,b<=10亿)
输出
针对每组案例,输出一个整数,表示f(a,b)的值。
每组案例输出完都要换行。
样例输入
2
8 1
8 2
样例输出
4
3
解决方案
//Boss.Yang. 2020.11.2
#include<iostream>
using namespace std;
int f(int n);
int main()
{
int n;
cin >> n;
while (n--)
{
int a, b;
cin >> a >> b;
int cnt = 0;
while (cnt < b && cnt < 31 && a != 2)//防止超时
{
a = f(a);
cnt++;
}
cout << a << endl;
}
}
int f(int n)
{
int s = 1;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
int a = 0;
while (n % i == 0)
{
n /= i;
a++;
}
s = s * (a + 1);
}
if (n == 2)
{
break;
}
}
if (n > 1)
{
s = s * 2;
}
n = s;
return n;
}