ACM模拟题详解(3)——数论(续)

5、Prime Ring Problem

Problem Description

A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

Note: the number of first circle should always be 1.

Input

n (0 < n < 20).

Output

The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.

Sample Input

6

8

Sample Output

Case 1:

1 4 3 2 5 6

1 6 5 2 3 4

Case 2:

1 2 3 8 5 6 7 4

1 2 5 8 3 4 7 6

1 4 7 6 5 8 3 2

1 6 7 4 3 8 5 2

翻译:n个数字(1,2,3...n)围成一个圈,要求相邻的两个数字之和是质数。题目要求根据给出的n,计算所有能够组成满足条件的圈的数字序列。

解题思路:

首先选择1,然后选择和1相加等于质数的数字,可能有很多种情况,例如(n=6的情况):

1+2

1+4

1+6

然后针对每种情况,再选择与第二个数的和为质数的数字,得到下面的序列

1+2+3

1+2+5

1+4+3

1+6+5

直到所有的数字都选择完,把所有的组合列出即可。计算的过程就是构造下面的树的过程。

从图中可以看出1-4-3-2-5-6 和 1-6-5-2-3-4是两个合法的解。

对于树的遍历可以采用深度优先,也可以采用广度优先,如果采用广度优先占用的内存比较大,所以解空间比较大的时候不宜采用。

下面是采用广度优先实现的(当n=18和n=20的时候内存不够用)

/*

* Prime Ring Problem

*/

public static void test4(int n){

int values[] = new int[n];

// 初始化

for(int i=0;i<n;i++){

values[i] = i+1;

}

// 表示遍历过程中可能的解

List list = new ArrayList();

list.add(values);

// 处理后面的n-1个数字,1永远是第一个

for(int i=1;i<n;i++){

List temp = list;

list = new ArrayList();

// 对于每个可能的解,得到下一层节点

for(int j=0;j<temp.size();j++){

int tempValues[]=(int[])temp.get(j);

// 考虑所有可能的组合

for(int k=i;k<n;k++){

if(isPrime(tempValues[i-1]+tempValues[k])){

// 创建新的状态,并复制原来的值

int[] newValues = Arrays.copyOf(tempValues, tempValues.length);

// 交换i和k处的值

if(i!=k){

int change = newValues[i];

newValues[i] = newValues[k];

newValues[k] = change;

}

// 把新状态添加到列表中

list.add(newValues);

}

}

}

}

// 输出结果

for(int i=0;i<list.size();i++){

int[] tempValues = (int[])list.get(i);

if(isPrime(tempValues[0]+tempValues[n-1])){

for(int j=0;j<n;j++){

System.out.print(tempValues[j]+" ");

}

System.out.println();

}

}

System.out.println(list.size());

}

下面是深度优先的算法。

/*

* Prime Ring Problem(深度优先)

*/

public static void test5(int n){

// 数组的前n个元素表示环中的数字,第n+1个数据表示数组中前n+1个元素是满足条件的

int values[] = new int[n+1];

// 初始化

for(int i=0;i<n;i++){

values[i] = i+1;

}

values[n]=1;

// 表示遍历过程中可能的解

List list = new ArrayList();

list.add(values);

StringBuffer sb = new StringBuffer();

while(list.size()>0){

// 取出第一个元素

int tempValues[]=(int[])list.get(0);

// 表示处理到第几层,第一层用0表示

int index=tempValues[n];

// 遍历并生成所有可能的下一层节点

for(int k=tempValues[n];k<n;k++){

if(isPrime(tempValues[index-1]+tempValues[k])){

// 如果是最后一层并且,最后一个数和第一个数的和

// 也是质数,则输出结果

if(index==n-1 && isPrime(tempValues[index]+1)){

for(int j=0;j<n;j++){

sb.append(tempValues[j]+" ");

}

sb.append("\n");

// 分批输出

if(sb.length()>10000){

System.out.print(sb.toString());

sb=new StringBuffer();

}

continue;

}

// 创建新的状态,并复制原来的值

int[] newValues = Arrays.copyOf(tempValues, tempValues.length);

// 交换i和k处的值

if(index!=k){

int change = newValues[index];

newValues[index] = newValues[k];

newValues[k] = change;

}

newValues[n] = newValues[n]+1;

// 把新状态添加到列表中,放在最前面,深度优先,

// 如果采用广度优先,则应该放到最后面

list.add(0,newValues);

}

}

// 从list中删除当前的节点

list.remove(tempValues);

}

System.out.print(sb.toString());

}

6、人见人爱A^B

Problem Description

求A^B的最后三位数表示的整数。

说明:A^B的含义是“A的B次方”

Input

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Input

2 3

12 6

6789 10000

0 0

Sample Output

8

984

1

解题思路:要求6789的10000次方,使用Java语言提供的数据类型肯定要越界,可以使用之前介绍的大数解决方案,但是计算量会非常大。仔细看这道题会发现要求求结果的后3位,所以6789*6789与789*789的结果的后3位是相同的,所以在处理的时候只需要考虑后3位即可,这样处理解简单了。下面的代码供参考:

/*

* A的B次方的后3位

*/

public static int test6(int a,int b){

// 保留后3位

int temp = a%1000;

int result = temp;

for(int i=1;i<b;i++){

result = (result*temp)%1000;

}

return result;

}

ACM数论专题1——gcd与lcm ACM数论专题1——gcd与lcm前言最大公约数和最小公倍数是什么?如何求得最大公因数和最小公倍数?最小公倍数的求解与证明求解证明最大公因数的证明与求解证明求解相关应用以及扩展公式相关应用太多了先挖坑吧扩展公式 前言 作为一个数学选手没有数学部分的总结是不完美滴~~ 既然有句话叫“数论只会gcd”,那就从gcd开始吧~ 最大公约数和最小公倍数是什么? 最大公因数1 也称最大公约数,指两个或多个整数... 阅读详情

相关推荐

ACM算法中数论核心知识详解与实战解析

数论作为ACM算法竞赛中的核心模块之一,是解决整数性质、同余关系与模运算等问题的理论基石。本章系统梳理整除性、最大公约数(GCD)、最小公倍数(LCM)的数学定义及其性质,深入讲解带余除法原理与唯一分解定理——即任一大于1的整数均可唯一表示为有限个素数的乘积。通过形式化定义模算术中的加、减、乘运算规则,建立同余关系的基本框架,为后续章节中快速幂、扩展欧几里得及中国剩余定理的学习奠定基础。同时,引入数论在现代密码学(如RSA)、哈希函数设计和伪随机数生成器中的实际应用,增强理论学习的工程指向性与现实意义。

weixin_42599908的博客 897

HDU-2035人见人爱A^B

HDU-2035人见人爱A^B 题目: 求A^B的最后三位数表示的整数。 说明:A^B的含义是“A的B次方” Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1&amp;lt;=A,B&amp;lt;=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。 Output 对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。 Sample Input 2 ...

qq_41998938的博客 534

Matlab R2024a硬件支持包安装避坑指南:以Arduino为例(附离线包下载)

本文详细介绍了Matlab R2024a硬件支持包(Support Package)的安装流程,特别是针对Arduino平台的避坑指南和高效部署方法。从环境准备、离线安装方案到Arduino支持包的专项优化,提供了全面的技术细节和解决方案,帮助开发者避免常见错误,实现快速部署。

weixin_33737134的博客 449

求A^B的最后三位数表示的整数

Problem Description 求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方” Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。 Output 对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。 Sampl...

1298

AI学习记录 - transformer的位置编码的理解

先看三角函数为什么可以,我们看下三角函数的图像先提一个点:位置信息肯定是唯一的,或者是在很长的文字当中,起码重复度不会太高,x轴代表位置,y轴代表叠加上去的值1、假设只使用一个三角函数sin,我们将第2和第14两个位置输入到sin,他们的值很像,在神经网络的训练中,很容易把第2个位置和第14个位置当成是一个位置,不满足我们上面说到的要求位置唯一性。sin2sin14。

weixin_43954090的博客 1413

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

IP Address

IP Address Description  Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of '1s' and '0s' (bits) to a dotted d

天泽28的专栏 880

S7-1200PLC V90伺服绝对值编码器校准功能块

S7-1200PLC通过111报文和EPOS模式实现位置轴轴控功能(FB284封装)-优快云博客文章浏览阅读173次。EASY_SINA_POS的详细使用介绍请参考下面文章链接:S7-1200PLC使用标准报文111和EPOS模式实现V90 PN总线伺服定位(Easy_SINA_Pos)_西门子sinapos-优快云博客文章浏览阅读132次。文章浏览阅读7k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。

RXXW_Dor的博客 969

【更新完毕】《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)

《算法竞赛中的初等数论》(信奥 / 数竞 / ACM)由我个人整理的算法竞赛数论合集,近五万字,近十五万字符,算法竞赛,数论相关,这一篇就够了

繁凡さん的博客 3万+

addr2line解析不出来行号的解决方式(汇编解析高阶版)

摘要:本文针对AEC crash问题中addr2line无法解析行号的情况,通过llvm-addr2line和反汇编分析,定位到CamX::AECBEStats17::AdjustROIParams函数中的乘法溢出问题。关键发现包括: 常规addr2line只能解析到函数名但无具体行号 llvm-addr2line解析出多个可能溢出点(行196/204/211/218/270/271) 反汇编显示6个条件分支跳转到溢出处理函数 源码分析确认这些位置均存在乘法运算 最终通过汇编级调试工具成功定位UBsan报告

169

STM32cubemx配置驱动DHT11模块

本篇文章将带大家学习使用DHT11湿温度模块,使用这个模块可以获取当前的温度和湿度数据。DHT11可以用于智能家居,蔬菜大棚等项目当中适用范围广。DHT11 是一种数字式温湿度传感器,由杜邦公司推出。它可以测量环境中的温度和湿度,并将测量结果以数字形式传输给微控制器或其他电子设备,适用于通过数字信号读取环境温湿度的应用场景。DHT11 传感器使用单总线数据交换协议,可以通过一个 I/O 引脚进行控制和数据传输。

m0_49476241的博客 5912

ACM在线模版-f-zyj

试图打造最为完善最为工整的ACM竞赛模版!!!By-f-zyj 在线速查!赛前整理打印,为比赛做足准备-_-#

逐梦者 11万+

基于Python的农业市场价格抓取与供需分析:现代爬虫技术与实战应用

在正式开始爬虫开发之前,我们首先了解爬虫的基本概念和工作原理。爬虫(Web Scraping)是通过编程的方式,自动从互联网上获取信息的技术。它可以帮助我们提取HTML页面中的特定数据,通常用于收集并处理大量信息。发送HTTP请求:爬虫需要向目标网站发送请求,获取网站的HTML页面内容。解析HTML页面:通过HTML解析器对获取的页面内容进行解析,提取其中需要的数据。数据清洗与存储:将提取的数据进行清洗,去除多余的字符或无关内容,然后存储到合适的格式(如CSV文件、数据库等)中。数据分析与可视化。

2201_76125261的博客 1118

ACM模块解析之 数论

数  论一.简介数论是ACM中的重点内容。历年竞赛题目,一般都有1~2道题目与数论有密切关系。数论涉及的概念和算法很多,用途也非常广泛。掌握与数论有关的方法,是参赛者需要具备的必要技能。数论的学习应该注意简单的概念要能熟练掌握,可以手写代码。较难理解的概念和知识点应注意模板的整理,模板的整理要注意规范接地气,变量名函数名简单易懂通用,写明模板函数的作用,在比赛中能快速上手使用,最好是本人理解后所写...

popcjz的博客 783

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【数论】ACM数论基础知识总结

文章目录一.质数1.定义2.质数的判断3.质数的筛选4.质因子分解5.互质二.同余1.模运算 数论是数学的一个分支,研究的是整数的性质。本篇文章总结的是数论在ACM中的常见应用。 一.质数 1.定义 质数,又称素数,若一个正整数无法被除了1和它自身以外的其它数整除,则称其为质数,否则为合数。特殊地,1既不是合数也不是质数 2.质数的判断 给定一个数,判断是否为质数的方法: 试除法: 检查所有可能成为n的因子的数,若没有找到因子,则证明这个数是一个质数 一种朴素的做法就是从2遍历到N-1观察有无N的因子,

Qiuker_jl的博客 3268

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ACM中的数论

ACM中的数论是计算机科学领域中的一个重要分支,它主要研究整数的性质、运算规律和它们之间的关系。在ACM竞赛中,数论问题经常出现,因此掌握一定的数论知识对于参加ACM竞赛的选手来说是非常重要的。同余方程:形如x≡a(mod m)的方程,其中x是整数,a和m是已知整数。求解这类方程的方法称为同余方程的解法。离散对数问题:给定一个整数n和一个整数g,求解满足ax^2+by=n的整数解(x,y)的数量。密码学:在密码学中,很多加密算法都涉及到大整数的乘法和取模运算,例如RSA加密算法、椭圆曲线加密算法等。

想要AC的sjh的博客空间 1175

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: ACM模拟题详解(2)——简单数论
下一篇: ACM模拟题详解(3)——数论(续)
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值