栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

题目:

做题思路:

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


欧拉函数:
就是对于一个正整数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
#include
using namespace std;
typedef long long ll;
#include
int su[10] = { 0,2,3,5,7,11,13,17,19,23 };//取从2乘到23就已经可以取到所有的n
bool 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:新年快乐啊各位大佬。新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐新年快乐

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737671.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号