反素数 TIMUS 1748

本文介绍了一种求解特定范围内因子最多且值最小的数(反素数)的算法。利用质因数分解特性,通过深度优先搜索(DFS)策略高效找出目标数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出n,求1—n中因子最多的数的最小值,即反素数

思路:根据反素数分解质因数后,质因子越小,其对应指数越大的性质,直接DFS即可

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define For(i,j,k) for(int i = j;i <= k;i ++)
using namespace std;

const int P[20] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
typedef long long LL;
LL cnt, num, n;

void AntiPrime(int k, LL now, LL ct, int Max_exp){
	if(ct > cnt) cnt = ct, num = now;
	if(ct == cnt && num > now) num = now;
	LL t = 1;
	For(i,1,Max_exp){
		t *= P[k];
		if(now <= n / t)
			AntiPrime(k + 1, now * t, ct * (i + 1), i);
	}
}

int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		scanf("%lld", &n);
		cnt = 1, num = n;
		AntiPrime(0, 1, 1, 60);
		printf("%lld %lld\n", num, cnt);
	}
	return 0;
}


### 关于素数的定义 素数是一种特殊的素数形式,其定义如下:如果一个数是一个素数,并且它的逆序排列后的数字仍然是一个素数,则该数被称为素数[^3]。需要注意的是,素数不能是回文数(即正读和倒读相同的数),因为这样的数即使满足上述条件也不被认为是素数。 例如,17 是一个素数,而它转后得到 71 同样也是素数,因此 17 被认为是素数。然而,像 101 这样的回文素数不被视为素数,因为它本身与其转相同。 --- ### 使用 Python 实现素数查找的方法 以下是通过 Python 编程来找出一定范围内的所有素数的具体实现: #### 判断素数函数 首先需要编写一个用于判断某个数是否为素数的辅助函数 `is_prime`: ```python def is_prime(num): if num < 2: return False for k in range(2, int(num ** 0.5) + 1): if num % k == 0: return False return True ``` 此函数利用试除法检测给定数值是否仅能被 1 和自身整除[^2]。 #### 主逻辑部分 接着构建主程序流程,其中包含对输入范围内每个候选值逐一验证的过程以及排除那些属于回文结构的情况: ```python def reverse_number(n): """返回整数n翻转后的结果""" rev = 0 while n > 0: rev = (rev * 10) + (n % 10) n //= 10 return rev def find_anti_primes(limit): anti_primes_list = [] for number in range(10, limit): str_num = str(number) # 如果当前数是回文则跳过 if str_num == str_num[::-1]: continue reversed_num = reverse_number(number) # 检查原数及其转数是否均为质数 if is_prime(number) and is_prime(reversed_num): anti_primes_list.append(number) return anti_primes_list # 测试调用 limit_value = 1000 result = find_anti_primes(limit_value) print(f"{len(result)}个素数存在于{limit_value}以内:") for p in result[:min(len(result), 10)]: print(p, end=" ") ``` 以上脚本会打印出指定上限之下的前若干个符合条件的素数实例。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值