寒假的牛客训练赛1补题

寒假我太摸鱼了

牛牛最近做了这么一道题:

"对于一给定的 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值