给出一篇有关素数线性筛和区间筛的博客,有兴趣的读者可以自取。

  

  本题大意:

    给定两个四位的素数,没有前导零,每次变换其中的一位,最终使得两个素数相等,输出最小变换次数。要求变换过程中的数也都是素数。

  本题思路:

    求最小步数,用BFS,判断素数,用欧拉筛打表。

  参考代码:

 #include <cstdio>
#include <queue>
#include <map>
#include <cstring>
using namespace std; int star, finish, ans, total = ;
const int maxn = + ;
bool isprime[maxn];
bool isvisited[maxn];
int prime[]; struct node{
int cur, step;
} now, Next; void get_prime() {//欧拉筛打表
memset(isprime, false, sizeof(isprime));
for(int i = ; i < maxn; i ++) {
if(!isprime[i])
prime[total ++] = i;
for(int j = ; j < total; j ++) {
if(prime[j] * i > maxn) break;
isprime[prime[j] * i] = true;
if(i % prime[j] == ) break;
}
}
} int bfs() {
queue <node> Q;
isvisited[star] = true;
now.cur = star;
now.step = ;
Q.push(now);
while(!Q.empty()) {
char num[];
now = Q.front();
Q.pop();
if(now.cur == finish) return now.step;
for(int i = ; i < ; i ++) {
sprintf(num, "%d", now.cur);
for(int j = ; j < ; j ++) {
if(j == && i == ) continue;
if(i == )
Next.cur = j * + (num[] - '') * + (num[] - '') * + (num[] - '');
else if(i == )
Next.cur = j * + (num[] - '') * +(num[] - '') * + (num[] - '');
else if(i == )
Next.cur = j * + (num[] - '') * + (num[] - '') * + (num[] - '');
else if(i == )
Next.cur = j + (num[] - '') * + (num[] - '') * + (num[] - '') * ;
if(!isprime[Next.cur] && !isvisited[Next.cur]) {
Next.step = now.step + ;
isvisited[Next.cur] = ;
Q.push(Next);
}
}
}
}
return -;
} int main () {
memset(isvisited, false, sizeof(isvisited));
get_prime();
int t;
scanf("%d", &t);
while(t --) {
memset(isvisited, false, sizeof(isvisited));
scanf("%d %d", &star, &finish);
ans = bfs();
if(ans == -) printf("Impossible\n");
else printf("%d\n", ans);
}
return ;
}

POJ-3126.PrimePath(欧拉筛素数打表 + BFS)的更多相关文章

  1. Poj 2478-Farey Sequence 欧拉函数,素数,线性筛

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 5647 D ...

  2. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  3. Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

    题意:给一个数 可以写出多少种  连续素数的合 思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数) 其中:线性筛的证明参考:https://blog.csdn.net ...

  4. Goldbach's Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想

    题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i]  i这个数是不是素数  在线性筛后面加个装桶循环即可 #inc ...

  5. poj 2480 Longge's problem 欧拉函数+素数打表

    Longge's problem   Description Longge is good at mathematics and he likes to think about hard mathem ...

  6. Dirichlet's Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛

    题意 给出a d n    给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 #include<cstdio> #inclu ...

  7. [bzoj3308]九月的咖啡店_欧拉筛素数_费用流

    bzoj-3308 九月的咖啡店 题目大意:深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不 ...

  8. [CF261E]Maxim and Calculator_搜索_欧拉筛素数_动态规划

    Maxim and Calculator 题目链接:https://www.luogu.org/problem/CF261E 数据范围:略. 题解: 考试的时候只会暴力,学弟太强了$\%\%\% Or ...

  9. POJ 3126 Prime Path (bfs+欧拉线性素数筛)

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

随机推荐

  1. <基础> PHP 数据类型

    PHP三大数据类型 标量 字符串 单引号:不能解析变量  效率高 双引号 :可以解析变量   效率稍微低一些 heredoc : 大文本 整形 浮点 不能用于比较运算 布尔 复合 数组 超全局数组  ...

  2. day32-常见内置模块一(random、time、datetime、os、sys)

    一.random模块 #随机小数>>> random.random() # 大于0且小于1之间的小数0.7664338663654585>>> random.uni ...

  3. day31-软件开发规范

    一.为什么要规范软件开发? 1.1 为什么要有规范软件开发 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目, ...

  4. Linux查看当前系统的发行版信息

    lsb_release命令用来查看当前系统的发行版信息(prints certain LSB (Linux Standard Base) and Distribution information.). ...

  5. hdoj 1003 学习思路

    基本解题思路:动态规划,不考虑穷举,分治. 根据网上,状态转移方程是:MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]} 翻译公式:到当前位置i 时,最大子序列和为: ...

  6. groovy语法

    1.注释1.1. 单行注释1.2. 多行注释1.3. GroovyDoc注释1.4. Shebang线2.关键词3.标识符3.1. 普通标识符3.2. 带引号的标识符4.字符串4.1. 单引号字符串4 ...

  7. angular的启动原理

    当你用浏览器去访问index.html的时候,浏览器依次做了如下一些事情: 加载html,然后解析成DOM: 加载angular.js脚本:加载完成后自执行,生成全局angular对象,监听DOMCo ...

  8. PRC远程过程调用

    RPC(Remote Promote Call) 一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简单.透明.RPC框架负责屏蔽底层的传输方式(TCP ...

  9. c/c++基础 const

    int main(int argc, char* argv[]) { '; '; a1='; //a2='2'; //a2是字符常量 "; "; a3="; //a4=& ...

  10. hadoop-2.7.3完全分布式部署

    一.环境介绍      IP       host JDK linux版本 hadop版本 192.168.0.1 master 1.8.0_111 centos7.2.1511 hadoop-2.7 ...