欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

牛牛做数论<每日一题分享>

时间:2023-06-06

题目:

做题思路:

做这题我们首先要了解什么是欧拉函数


欧拉函数:
就是对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。

欧拉函数的通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn)


其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。


那么题目所给的H(x)表达式为H(x)=(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn).

其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。

所以题目转换成求

2到n的满足条件1最小的一个值

2到n的满足条件1最大的一个值

由H(x)函数求的为从2到n的所有的(1-1/p)的乘【p为所有不同的质因子】

那么我们可以轻易的推出

要使H(x)最小

那么我们只需满足使n所有不同的质因子(1-1/p)相乘

要使H(x)最大

那么我们就要找到

从n一直向下的最大的素数

 下面的图片可以帮助大家理解为什么会这样:

 故我们可以写出代码详解:

#include#includeusing namespace std;typedef long long ll;#includeint su[10] = { 0,2,3,5,7,11,13,17,19,23 };//取从2乘到23就已经可以取到所有的nbool sushu(int n)//判断素数{ if(n==2||n==3) return 1; if(n%6!=5&&n%6!=1) return 0; for(int i=5;i*i<=n;i+=6) { if(n%i==0||n%(i+2)==0) return 0; } return 1;}int main(){int t;cin >> t;int n;while (t--){int ans1 = 1, tmb = 3;scanf("%d", &n);ll ans2 = n;if (n == 1)//特殊情况特判{cout << -1 << endl;continue;}for (int i = 1; i <= 9; i++)//找到小于n的最大能够取的乘积{if (su[i] * ans1 <= n) ans1 *= su[i];else break;}while (1)//从n递减,找到2到n的最大素数{if (sushu(ans2)) break;ans2--;}cout << ans1 << " " << ans2 << endl;}return 0;}

 PS:新年快乐啊各位大佬。新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。