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

别光看原理图了!手把手教你用Altium Designer搞定STM32F411最小系统的PCB布局(附电源/晶振/复位电路实战)

本文详细介绍了使用Altium Designer进行STM32F411最小系统PCB布局的实战技巧,涵盖电源分配网络优化、高速信号布线及系统级布局策略。通过规范的工程结构建立、关键设计规则预设和核心电路模块布局,帮助工程师提升PCB设计效率与信号完整性。特别针对STM32最小系统的电源、晶振和复位电路提供了专业解决方案。

weixin_42653691的博客 171

求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

Ubuntu 22.04下Realtek R8125网卡驱动安装避坑指南(附DKMS自动编译配置)

本文详细介绍了在Ubuntu 22.04系统上为Realtek R8125 2.5GbE网卡安装驱动的完整流程与避坑指南。针对内核通用驱动r8169的冲突问题,重点讲解了如何通过DKMS(Dynamic Kernel Module Support)实现驱动的持久化自动编译与安装,确保系统内核升级后网卡驱动依然有效。内容包括环境准备、驱动源码获取、DKMS标准配置、驱动冲突解决(设置黑名单)以及日常维护与故障排查方法,旨在为用户提供一个一劳永逸的稳定解决方案。

echo99的专栏 1023

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4113

Prime Ring Problem

Prime Ring Problem 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...

leihao-lester 268

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3059

HDU 1016 Prime Ring Problem(深搜+回溯+剪枝+Eratosthenes素数筛)

Prime Ring Problem 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. In.

Defepe 224

工业自动化中气动夹爪选型、调试与维护全流程实战解析

在工业自动化领域,气动执行元件是实现精准抓取与搬运的基础。其工作原理是通过压缩空气驱动气缸,转化为直线或旋转运动,从而控制夹爪的开合。这类技术因其结构简单、响应快速、成本低廉及维护方便,在自动化产线中具有极高的技术价值,是实现高效、可靠物料搬运的核心单元。其典型应用场景涵盖电子装配、汽车制造、食品包装等行业的上下料、分拣与定位工序。本文以工业自动化中常见的二指平行气动夹爪(常被工程师代号化为“Gripper-A”)为例,深入剖析其从硬件选型、气动系统集成到程序逻辑联锁的完整工程实践。内容聚焦于夹持力计算中惯

weixin_42629671的博客 368

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

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

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

繁凡さん的博客 3万+

Android逆向实战:抖音聊天记录数据库解析与导出(附完整SQL查询)

本文提供了一份Android逆向实战指南,详细解析了抖音聊天记录数据库的结构与导出方法。通过定位核心的`im.db`数据库文件,深度解读conversation_list、msg等关键表结构,并附上完整的SQL查询语句,帮助开发者或研究人员安全、合规地提取和分析本地聊天数据,适用于移动安全研究与数据分析场景。

mango的博客 861

ACM在线模版-f-zyj

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

逐梦者 11万+

VSLAM框架对比

格VSLAM特点介绍: (一)ORB-SLAM2 (二)ORB-SLAM3 (三)LSD-SLAM (四)

ljtx200888的博客 2295

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ACM模块解析之 数论

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

popcjz的博客 783

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

Qiuker_jl的博客 3268

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ACM中的数论

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值