寒假我太摸鱼了
牛牛最近做了这么一道题:
"对于一给定的 n(1≤n≤109)n(1\leq n\leq 10^{9})n(1≤n≤109),计算ϕ(n)\phi(n)ϕ(n), 之中 ϕ(x)\phi(x)ϕ(x)是满足1≤y≤x1\leq y \leq x1≤y≤x 且 gcd(x,y)=1gcd(x,y)=1gcd(x,y)=1的yyy的个数。例如: ϕ(6)=2\phi(6)=2ϕ(6)=2、ϕ(5)=4\phi(5)=4ϕ(5)=4."
牛牛一眼看出这就是欧拉函数,于是立刻用嘴巴解决了这道题。
牛牛意犹未尽,于是他又给你出了一道题。对于一个正整数 xxx,牛牛定义H(x)H(x)H(x) :
H(x)=ϕ(x)xH(x)=\frac{\phi(x)}{x}H(x)=xϕ(x)
牛牛还规定,该函数的定义域为除了111的所有正整数。
于是,牛牛给出了一个整数nnn,想要你回答两个关于H(x)H(x)H(x)的问题:
1、 回答一个 x0∈[2,n]x_{0}\in [2,n]x0∈[2,n],使得 H(x0)H(x_{0})H(x0) 取到 H(x)H(x)H(x) 在 [2,n][2,n][2,n]的最小值。若存在多个这样的x0x_0x0,输出最小的一个。
2、 回答一个 x0∈[2,n]x_{0}\in [2,n]x0∈[2,n],使得 H(x0)H(x_{0})H(x0) 取到 H(x)H(x)H(x) 在 [2,n][2,n][2,n]的最大值。若存在多个这样的x0x_0x0,输出最大的一个。
输入描述:
第一行为一个整数T(1≤T≤100)T(1\leq T \leq 100)T(1≤T≤100),表示测试组数。
接下来的TTT行,每行包括一个整数n(1≤n≤109)n(1\leq n \leq 10^{9})n(1≤n≤109),牛牛给出的整数。
输出描述:
对于每个测试用例,输出两个空格分割的整数,依次为你对牛牛两个问题的答案。
特别的,若n=1n=1n=1,请输出−1-1−1表示H(1)H(1)H(1)没有定义。
示例1
输入
复制3 2 5 1
3 2 5 1
输出
复制2 2 2 5 -1
2 2 2 5 -1
说明
第二组样例中,H(1)H(1)H(1)未定义,H(2)=12,H(3)=23,H(4)=24,H(5)=45H(2)=\frac{1}{2},H(3)=\frac{2}{3},H(4)=\frac{2}{4},H(5)=\frac{4}{5}H(2)=21,H(3)=32,H(4)=42,H(5)=54。
• 问题一的答案为2、2×3、2×3×5、2×3×5×7......这些前若干个素 数的积中,最大的且不超过n的那一个,如n=233,则答案为 2×3×5×7=210。
• 问题二的答案为[2,n]中最大的素数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
ll prime[20]= {0,2,3,5,7,11,13,17,19,23,29,31,37,41};
ll t, n;
inline bool isP(ll x)
{
if(x<=3) return true;
for(ll i=2; i*i<=n; i++)
{
if(n%i==0) return false;
}
return true;
}
int main ()
{
cin>>t;
while(t--)
{
cin>>n;
if(n==1)
{
cout<<-1<<endl;
continue;
}
ll now=1,i=1;
while(now*prime[i]<=n)
{
now*=prime[i];
i++;
}
printf("%lld ",now);
while(!isP(n))
{
n--;
}
printf("%lld\n",n);
}
return 0;
}