当前位置: 首页 > web >正文

算法习题-经典环形涂色问题

在对某个圆上色,具体步骤为:  
首先在纸上画下一个圆O_1,然后在圆O1内画一个圆O2,圆O2 内不上色。  
现在将圆O1内除圆O2的区域等分为n个部分,如图所示。对此n个部分使用m种颜色上色,使得相邻两个区域的颜色不同,问共有多少种不同方案,由于结果可能很大,对10^9+7取模后输出。 (对于两种不同的方案,只要有一个区域上色的颜色不同,我们即认为是不同的)

解题思路:

a_n 表示当有n个部分,m种颜色时的所有方案数。考虑当n=1时,a_1=0因为当只有一个部分时,没有相邻的部分,不满足条件,因此种类有 0 个。考虑当n=2时,a_2=m*(m-1)。当有n个部分时,可以分为两种情况:

       1、 第 1 个和第 n-1 个相同时:第 n 个有 m-1 种选法,前 n-1 个的选法总数等于a_{n-2},因为第 1 个和第 n-1 个相同,因此相当于第 n-2 个直接连接在了第  1 个上,因此种数就相当于a_{n-2}因此,该种情况的总数为:(m-1)*a_{n-2}
       2、 第 1 个和第 n-1 个不同时:第 n 个有 m-2 种选法,而第 1 个到第 n-1 个就相当于一个完整的环,因此,种数为: a_{n-1} 因此,该种情况的总数为:(m-2) * a_{n-1}

由以上两种情况即可推导出递推式为:a_{n}=(m-2)*a_{n-1}+(m-1)*a_{n-2}\left ( n \geqslant 3 \right )

进一步化简,利用特征方程,进行尝试求解

变换形式:原式 = a_n-(m-2)*a_{n-1}-(m-1)*a_{n-2}=0
由于是二阶线性方程,

设 a_n=r^n,那末 a_{n-1}=r^{n-1}a_{n-2}=r^{n-2}
故:r^n-(m-2)*r^{n-1}-(m-1)*r^{n-2}=0
解得:r_1=-1r_2=m-1a_n=A*r_1^n+B*r_2^n

带入:a_1=0a_2=m*((m-1)
可得:a_n=(m-1)^n+(-1)^n*(m-1)

代码实现:

import java.util.*;
public class Main{static int p = (int)1e9 + 7;public static void main(String[] args) {Scanner sc = new Scanner(System.in);long n = sc.nextLong();long m = sc.nextLong();if(n == 2) System.out.println(m * (m-1) % p);else {long t1 = qmi(m-1,n);long t2 = (qmi(-1,n) * (m-1) + p) % p;System.out.println((t1 + t2) % p);}}static long qmi(long a,long k) {long res = 1;while(k != 0) {if((k & 1) == 1) res = res * a % p;a = a * a % p;k >>= 1;}return res;}
}

http://www.xdnf.cn/news/1489.html

相关文章:

  • 使用Handsontable实现动态表格和下载表格
  • 集结号海螺捕鱼游戏源码解析(第二篇):水浒传捕鱼模块逻辑与服务器帧同步详解
  • Fragment重叠
  • 相机中各个坐标系的转换关系如像素坐标系到世界坐标系以及相机标定的目的
  • 浏览器离屏渲染 vs. Electron离屏渲染——核心区别与应用场景
  • IP-guard离线卸载客户端及清除策略说明
  • 大模型Rag - 检索增强技术
  • Docker容器化部署注意事项与常见问题
  • pycharm调试typescript
  • AIGC架构与原理
  • SwiftUI 2.Image介绍和使用
  • 【初级】前端开发工程师的面试100题(速记版)
  • 基于多用户商城系统的行业资源整合模式与商业价值探究
  • SpEl表达式使用示例
  • 简洁版C++类说明
  • 第四章:任务工作流编排
  • C语言 ——— 分支循环语句
  • Redis 主从复制
  • Codeforces Round 998 (Div. 3) ABCD
  • 深度解析 Java 中的 `computeIfAbsent`:原理、最佳实践与高级用法
  • Leetcode98、230:二叉搜索树——递归学习
  • 第12章:MCP服务端项目开发实战:数据持久化
  • React Ref引用机制解析
  • 文档构建:Sphinx全面使用指南 — 进阶篇
  • Axure中继器表格:实现复杂交互设计的利器
  • Linux磁盘管理
  • QT项目----电子相册(4)
  • 单片机通讯外设 (UART)、I2C、SPI、CAN 和 LIN 时序分析 使用场景以及优缺点对比分析报告
  • stm32之GPIO函数详解和上机实验
  • Spring Boot中的监视器:Actuator的原理、功能与应用