反素数ant BZOJ - 1053

本文介绍了一种使用唯一分解定理的搜索算法,并通过一个具体的编程实现案例进行了展示。该案例通过预处理的方式生成了一系列数值,这些数值能够有效地解决特定的问题。

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

题目传送门

思路:这个题本来应该是一个用上唯一分解定理的爆搜,但是我没有想到一个好的放大就直接打了一个表来做的(以后补上爆搜的方法)。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

#define MAXN 50010
#define MAXE 5
#define INF 1000000000
#define MOD 1000000007
#define LL long long
#define ULL unsigned long long
#define pi 3.14159

using namespace std;

LL num[] = {1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560, 10080, 15120, 20160, 25200, 27720, 45360, 50400, 55440, 83160, 110880, 166320, 221760, 277200, 332640, 498960, 554400, 665280, 720720, 1081080, 1441440, 2162160, 2882880, 3603600, 4324320, 6486480, 7207200, 8648640, 10810800, 14414400, 17297280, 21621600, 32432400, 36756720, 43243200, 61261200, 73513440, 110270160, 122522400, 147026880, 183783600, 245044800, 294053760, 367567200, 551350800, 698377680, 735134400, 1102701600,
    1396755360, 3000000000};

int main() {
    std::ios::sync_with_stdio(false);
    LL n;
    cin >> n;
    int cnt = 0;
    while (num[cnt] <= n) {
        cnt++;
    }
    cout << num[cnt - 1] << endl;
    return 0;
}

/*
 2
 4
 6
 12
 24
 36
 48
 60
 120
 180
 240
 360
 720
 840
 1260
 1680
 2520
 5040
 7560
 10080
 15120
 20160
 25200
 27720
 45360
 50400
 55440
 83160
 110880
 166320
 221760
 277200
 332640
 498960
 554400
 665280
 720720
 1081080
 1441440
 2162160
 2882880
 3603600
 4324320
 6486480
 7207200
 8648640
 10810800
 14414400
 17297280
 21621600
 32432400
 36756720
 43243200
 61261200
 73513440
 110270160
 122522400
 147026880
 183783600
 245044800
 294053760
 367567200
 551350800
 698377680
 735134400
 1102701600
 1396755360
 */
### 关于素数的定义 素数是一种特殊的素数形式,其定义如下:如果一个数是一个素数,并且它的逆序排列后的数字仍然是一个素数,则该数被称为素数[^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、付费专栏及课程。

余额充值