牛客寒假训练营 1 D 牛牛做数论(打表,筛质数)

该博客探讨了欧拉函数在数论中的应用,特别是在寻找[2,n]区间内欧拉函数值最小和最大的数的问题上。通过分析欧拉函数的性质,博主展示了如何利用质数筛法有效计算这两个值。程序实现中,博主给出了C++代码,用于快速找到n以内的最小和最大欧拉函数值对应的数。
摘要由CSDN通过智能技术生成

思考:关于数据范围,由于范围是[1e9],那么质数只需要最多筛选前20个就可以了

分析:首先,欧拉函数 f(n)=1~n中所有与n互质的元素的个数

f(n)=n(1-1/p1)(1-1/p2)...(1-1/pk)

f(n)/n=(1-1/p1)(1-1/p2)...(1-1/pk)

那么,通过找规律我们发现

运用欧拉函数的模板可以得出
1:  1/1
2:  1/2
3:  2/3
4:  1/2
5:  4/5
6:  1/3
7:  6/7
8:  1/2
9:  2/3
10:  2/5
11:  10/11
12:  1/3
13:  12/13
14:  3/7
...

可以发现一个性质

  • [2,n]  函数值最小的数=尽可能多个质数的乘积
  • [2,n]  函数值最大的数=最大的质数

对于第一个问题最小的数,就去枚举前n个质数的乘积

对于第二个问题最大的数,从n往下开始找到最大的质数

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 25;
int p[N] = { 2,3,5,7,11,13,17,19,23,29,31,37 };
typedef long long ll;
bool is_prime(int n)
{
	for (int i = 2;i <= n / i;i++)
		if (n % i == 0) return false;
	return true;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
        if(n==1) {
            cout<<-1<<endl;continue;
        }
		ll minn = 1, maxx = 1;
		int i = 0;
		//需要开ll,不然会爆int
		while (minn * p[i] <= n)
			minn =minn* p[i],i++;
		for (maxx = n;maxx >= 2;maxx--)
			if (is_prime(maxx))
				break;
		cout << minn << ' ' << maxx << "\n";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值