数论初步(费马小定理) - Happy 2004

2023-11-12

Description

Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).

Take X = 1 for an example. The positive integer divisors of 2004^1 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6.
Input

The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000).

A test case of X = 0 indicates the end of input, and should not be processed.
Output

For each test case, in a separate line, please output the result of S modulo 29.
Sample Input

1
10000
0
Sample Output

6
10

 

 

 

-----------------------------------------------------------------我是分割线^_^--------------------------------------------------------------------------------

 

 

 

这个题的题目倒是挺happy的,做题的我一点都不happy,我一直在想这都什么方法,毕竟水太深了,我也溺水了= =
老样子,先解释题目:题目的意思就是给定一个X,要求求出2004的X次方的因数和,因数和嘛,比如4的因数和就是
1 + 2 + 4 = 7,然后呢,题目的意思就是这样,然偶我就懵比了,懵比了很久搜题解去了,搜到了还是懵比,什么鬼题解,
就不能说详细一点吗,详细一点的打字又不准确,不理解的部分有那么多.............算了不吐槽了= =

先来一条科普:费马小定理,
费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。
即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

结合一下同余德定理,a^(p - 1)%p = 1%p = 1,也就是说,在一些情况下可以把1替换成前面那个东西,等一下有用。

看着题目当然没头绪,直接来方法吧,我们先把2004分解质因数,得到了2,3,167,这些东西有什么用呢?下面再来看看一个新东西


一个数的因子和是一个积性函数
关于积性函数,即F(ab)=F(a)*F(b),在数论里有很多积性函数

来证明一下:

S(x)表示x的因子和。

如果x可以分成a,b(一定为素数),那么S(x)=S(a)*S(b)。

为什么一定要分成素数呢,因为一个素数的因子之后1和它本身,对于a,b 来说,就是1,a,1,b,那么x=a*b,x的因子只有1,a, b,x这四个数,

这就是所谓的一个数的因子和是一个积性函数。

 

则题目求为:S(2004^X)mod 29

那么可以知道:2004=4 * 3 *167(注意到4不是质数,但使用要求必须是质数,所以要替换成2的平方)
S(2004^X)=S(2^(2X)) * S(3^X) * S(167^X)

如果 p 是素数 则其因子只有1和它本身,因此在求其因数和的时候可以使用等比数列的求和公式,不懂得自己去用错位相减法重温一下高中知识= =,

所以有:S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1),这个表达式的意思是求p的x次方的这个数的因数和

所以:S(2004^X) % 29 = (2^(2X+1)-1) % 29 * (3^(X+1)-1)/2 % 29 * (167^(X+1)-1)/166 % 29,

因为答案是要对29取模的,所以前面一项可以动用快速幂取模算出来了,可是后面两个带有除法就有点难搞了,

在乘法中可以a*b%c = (a%c * b%c)%c, 加法中也可以有(a+b+c)%c = (a+(b+c)%c)%c,减法也是有的,和加法一样,

可惜的是除法是个奇葩,它非主流= =,所以不能这样这样算,不信的话你算一算(14/2)%4,你换成(14%4) / (2%4)答案

是不一样的,这个时候就要用到一种叫做逆元的东西,它的作用是把除法改成乘法取模,比如a/b % c 可以改成 a * b^(c-2)%c,

其中b^(c-2)%c就是b的逆元,这只是逆元的一种求解方法,由于结合了费马小定理,这种方法比较适合于计算机,因为可以用快速幂

取模进行运算求解,现在来开始变化:a/b % c = a * b^(-1) % c = a * b^(-1) * 1 % c,然后倒回去看上面的费马小定理的下面

那一条小提示,就可以把1替换了,结果变成了a * b^(-1) * b^(c-1) % c = a * b^(c-2) % c,好的,如此一来就顺利完成的转换,

除法的取模也变成的乘法,接下来就可以使用快速幂取模进行大屠杀了,不过写代码的时候要注意减一(等比数列求和)..........

 

 

#include<iostream>
#include<algorithm>
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> using namespace std; int Mod(int a, int b, int c) {//快速幂取模算出a的b次方模c的结果 int ans = 1; while (b) { if (b & 1) { ans = ans * a % c; } b >>= 1; a = a * a % c; } return ans; } int main()//如果看n有点不习惯,就按照上面的习惯看,把n换成x就行了 { //freopen("input.txt", "r", stdin); int n; while (scanf("%d", &n), n) { int a = Mod(2, 2 * n + 1, 29) - 1;//求S(a)  int b = (Mod(3, n + 1, 29) - 1) * Mod(2, 27, 29);//求S(b)  int c = (Mod(22, n + 1, 29) - 1) * Mod(21, 27, 29);//这里把167换成了22,是因为22与167对29是同余的,所以简化一下,求S(c) printf("%d\n", a * b * c % 29);//这里就是答案,S(答案) = S(a) * S(b) * S(c),还不理解就上去看看奇性函数= = } return 0; }




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数论初步(费马小定理) - Happy 2004 的相关文章

  • Linux防火墙

    安全防御 常见的攻击手段 拒绝服务 已知漏洞 口令破解 欺骗用户 常见的安全防御设备 基础类防火墙 IDS类 入侵检测系统 提供报告 事后分析 IPS类 入侵防御系统 针对数据包分析 根据模式匹配 阻断非法访问 主动安全类 什么是防火墙 工
  • 这篇文章带你读懂IP地址

    这篇文章带你读懂IP地址 一 IP地址介绍 二 IP地址分类及表示 三 IP地址的主要特点 四 特殊IP地址及私有IP地址 一 IP地址介绍 IP地址 全世界唯一的32位 4字节标识符 标识路由器主机的接口 IP地址 lt 网络号 gt l
  • 【Git CMD】Git上传本地代码到远程仓库(6步到位)

    步骤 1 创建指定名称的分支并切换至该分支 2 添加文件到暂存区 3 查看本地仓库和暂存区的状态 4 提交文件到本地仓库 5 查看本地仓库提交的历史 6 将本地当前分支推送到与本地当前分支同名的远程分支 1 创建指定名称的分支并切换至该分支
  • 学习PGL课程:图卷积网络GCN、图注意力网络GAT

    一 GCN 什么是图卷积 不同的地方在于 图像像素点周围的像素个数通常是固定的 而图结构上某个节点周围的节点数是不固定的 图卷积网络计算公式 1 邻接矩阵解释 2 度矩阵 表示节点与之相连节点的个数 包括自环 3 H l 表示第l次迭代的节
  • 具体项目下解决Echarts多端同步开发和维护的问题

    具体问题场景 PC端和移动端需要同时上线图表功能 没有多余工时 之后的版本迭代 功能 样式 配置等 默认双端同步 开发人员只希望维护一套代码 Echarts在移动端有部分功能不兼容不支持 Echarts在移动端的坑 移动端页面使用echar
  • Raspberry Pi使用TinyML运动识别

    我们将使用机器学习来构建在微型微控制器RP2040上运行的手势识别系统 探索Raspberry Pi Pico及其SDK Raspberry Pi Pico是具有灵活数字接口的低成本 高性能微控制器板 主要功能包括 Raspberry Pi
  • C11 : 函数模板 std::function

    目录 std function 定义 实现原理 应用 注意事项 std function 定义 类模板 std function 是一种通用的 多态的函数封装 std function 的实例可以对任何可以调用的目标实体进行存储 复制和调用
  • react hooks无法获取到最新值问题

    无法获取最新值的写法 在state中定义初始值 import React useState useEffect from react const type setType useState 0 通过setType方法修改type div s
  • 字符替换 英文字符串单词个数统计 python123题解

    字符替换 描述 假设有段英文 其中有单独字母 P 被误写为 p 请编写程序进行纠正 输入格式 用户输入一个字符串 不要使用提示词语 输出格式 程序输出字符串 其中原本包含的英文字母 p 全部被替换为 P 输入输出示例 输入 输出 示例 py
  • MYSQL常用字段属性

    MYSQL常用字段属性 1 DECIMAL M D 2 INT 3 VARCHAR 4 CHAR 5 TEXT 6 DATA 1 DECIMAL M D M是总位数 1 65 包含精度 D是小数位 0 30 当表示定点小数时使用类型 比fl
  • PostgreSQL配置优化

    转载请注明原文出处 http blog csdn net roddick621 PostgreSQL配置优化 PostgreSQL配置优化 硬件和系统配置 测试工具 配置文件 主要选项 测试数据 总结 硬件和系统配置 操作系统 Ubuntu
  • GVIM编辑器实现自定义配对关键字之间的跳转

    由于刚开始接触GVIM编辑器 在使用GVIM写Verilog代码的时候发现使用 命令可以实现配对括号之间的跳转 但其它的一些关键字之间却不能实现配对跳转 从而导致在代码量较大的时候常常会出现配对关键字多写或漏写的情况 很不方便 网上查阅了相
  • MMDetection新手安装使用教程(无限踩坑)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 MMDetection安装过程 1 torch torchvision的安装 2 mmdetection的安装 二 MMDetection的使用步骤 1
  • c++中的新成员——new,命名空间

    c 中的动态内存分配 优点 使用更加的方便 解决了c中有很时候没有库文件时不能申请堆内存的情况 使用 c 中是通过new关键字来进行内存空间的申请的 c 中动态内存是基于类型进行的 delete关键字用于释放 new在申请的时候可以进行初始
  • opentsdb+grafana监控环境搭建

    opentsdb是在hbase的基础上设计的时间序列数据库 安装opentsdb必须先有hbase hadoop和hbase是以集群的方式安装 如果在单台服务器上安装 下面的配置文件也是适合的 只要把相应的服务器名移除掉就可以 grafan
  • MAC地址会耗尽吗?

    有可能会耗尽 虽然目前离耗尽的日子还很远 先基本解释一下MAC地址的特点 虽然MAC地址有48位 但并非48位都是可以随便用的 就像IPv4虽然有32位 但也不是所有组合都可以使用一样 MAC地址第一字节的最低2位 bit 是标示地址类型的
  • 11.神经网络与机器学习(十)—卷积神经网络(CNN)

    1 引言 我们之前的神经网络结构都是全连接的 也就是说 每一个输入神经元的都和相邻层的每一个神经元连接 但是这种连接带来的数据量太大了 以我们之前的一个三层神经元举例 784 30 10 从输入层到隐藏层有 784 1 30 23550个参
  • 从零开始学HTML+CSS

    本文是基于b站黑马程序员的视频教程 然后总结自己的心得写的 只是自己的个人总结 如有错误 敬请指正 基于此链接最新前端开发入门教程 web前端零基础html5 css3 前端项目视频教程 哔哩哔哩 bilibili最新的web前端html5
  • python面向对象编程高级篇之枚举类Enum

    我们可以定义月份 比如 from enum import Enum Month Enum Month Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec for name member in Mo
  • 如何在opensea批量发布NFT(Goerli测试网)

    一 生成NFT图象 hashlips art engine HashLips Art Engine 是一种用于根据提供的图层创建多个不同的艺术作品实例的工具 1 安装 npm install or yarn install 2 使用 在 l

随机推荐

  • 微信小程序简单的信息表格的提交到数据库(新手篇)(云端数据库)

    微信小程序简单的信息表格的提交到数据库 新手专属 云端数据库 大家好 我是小陈 一名大一的编码爱好者 刚刚结束了大一的学习生活 也总结出了一点编码的经验 希望与大家一起分享 我是学习物联网的 总感觉大一的课程枯燥无味 所以索性自学了一点微信
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 持续集成平台-jenkin

    CI平台诞生的背景 很多公司因为种种原因 不想使用GitHub gitlab上的CI能力 或是希望定制一些功能更加强大的CI CD工作流 这时就需要一些更专业的CI平台了 CI平有那些 github gitlab Aone 阿里巴巴 织云
  • UE5学习笔记(1)——从源码开始编译安装UE5

    目录 0 前期准备 1 Git bash here 2 克隆官方源码 3 选择安装分支 4 运行Setup bat 下载依赖文件 5 运行GenerateProjectFiles bat生成工程文件 6 生成完成 找到UE5 sln UE4
  • mysql 设置默认值_MySQL InnoDB相关参数设置

    MySQL InnoDB相关参数设置 1 InnoDB参数 MySQL目前使用的主要为InnoDB引擎 一些InnoDB引擎参数调整到合理的值将很大程度上改善数据库性能 下面将对一些重要参数做说明 2 InnoDB参数调整 2 1InnoD
  • 【Java】使用iText生成PDF文件

    iText介绍 iText是著名的开放源码的站点sourceforge一个项目 是用于生成PDF文档的一个java类库 通过iText不仅可以生成PDF或rtf的文档 而且可以将XML Html文件转化为PDF文件 项目要使用iText 必
  • fopen()和fwrite()函数介绍及用法

    一 fopen 头文件 include
  • 服务器文件夹设置只有读写权限 IIS,iis 读写服务器的权限设置

    iis 读写服务器的权限设置 内容精选 换一换 打开FTP服务器上的文件夹时发生错误 请检查是否有权限访问该文件夹 浏览器设置了FTP防火墙 以设置IE浏览器为例 打开IE浏览器菜单 工具 gt Internet 选项 选择 高级 标签卡
  • sqlite和一般主流数据在sql语句的区别

    sql语句中经常存在根据类型查数据 有时候条件是字符型 有时候是数字 由于数据库的差异 最好在写sql语句时 同意写成带引号 比如下面 select from tb project info where 1 1 and PROJECT CO
  • Ubuntu20.4 Android-9.0.0_r46源码下载编译

    Ubuntu20 4 Android 9 0 0 r46源码下载编译调试 安装Ubuntu虚拟机 ubuntu镜像下载地址 https ubuntu com download 官网下载地址较慢可以去 清华源 中科大源 华为 阿里源直接下载都
  • C++学习(四十八)homebrew及其安装

    Homebrew是一款Mac OS平台下的软件包管理工具 拥有安装 卸载 更新 查看 搜索等很多实用的功能 简单的一条指令 就可以实现包管理 而不用你关心各种依赖和文件路径的情况 十分方便快捷 在Homebrew中 软件包分为 CLI 软件
  • 初识网络原理(笔记)

    目录 编辑局域网 网络通信基础 IP 地址 端口号 协议 协议分层 TCP IP 五层网络模型 网络数据传输的基本流程 发送方的情况 接收方的情况 局域网 搭建网络的时候 需要用到 交换机 和 路由器 路由器上 有 lan 口 和 wan
  • pycharm自动打开最近项目

    1 当每次需要打开不同的项目时 需要关闭pycharm自动打开最近项目的功能 File gt setting gt Appearance Behavior gt System Setting gt Startup Shutdown 取消 R
  • Qt错误汇总

    1 error linker command failed with exit code 1 use v to see invocation 错误原因1 类中声明的方法没实现体 解决办法1 查找那个方法 在cpp中添加实现就行了 illeg
  • 转 Unity知识点0001(Yanlz+协程+List+MeshRender+对象池+链条关节+PlayerPrefs+脚本生命周期+LOD+)

    https blog csdn net VRunSoftYanlz article details 80302012 Unity知识点0001 Yanlz 协程 List MeshRender 对象池 链条关节 PlayerPrefs 脚本
  • Markdown 文件转word格式

    操作步骤 1 打开typora官网 https www typora io 一直往下拉 根据操作系统选择下载typora安装版本 2 安装typora 打开Markdown文件 3 文件 gt gt 导出 gt gt word 4 第一次导
  • 深度学习训练之学习率LR系统总结

    文章目录 1 StepLR 2 MultiStepLR 3 ExponentialLR 4 CosineAnnealingLR 5 CyclicLR 6 ReduceLROnPlateau 1 StepLR 先上API optimizer
  • npm ERR Error while executing npm ERR

    npm ERR Error while executing npm ERR d Program Files Git cmd git EXE ls remote h t https github com nhn raphael git npm
  • Vue的 this.$refs.xxx 报错undefined解决办法

    目录 一 背景 二 解决办法 1 DOM加载完成后再调用 2 子组件第一次加载时不调用 一 背景 用ref 注册子组件 父组件可以通过this refs xx fn调用子组件里的函数 页面初始化的时候调用this refs xxx的时候提示
  • 数论初步(费马小定理) - Happy 2004

    Description Consider a positive integer X and let S be the sum of all positive integer divisors of 2004 X Your job is to