为什么要模1000000007
先看一下常用数据类型的数值范围(32位系统)
字节 类型 范围 长度
字节 | 类型 | 范围 | 长度 |
---|---|---|---|
一字节(2^8) | char | -128 ~ 127 | 3 |
一字节(2^8) | unsigned char | 0 ~ 255 | 3 |
二字节(2^16) | short | -32768 ~ 32767 | 5 |
二字节(2^16) | unsigned short | 0 ~ 65535 | 5 |
四字节(2^32) | unsigned int | 0~4294967295 | 10 |
四字节(2^32) | int | -2147483648~2147483647 | 10 |
四字节(2^32) | unsigned long | 0~4294967295 | 10 |
四字节(2^32) | long | -2147483648~2147483647 | 10 |
八字节(2^64) | long long (g++) | -9223372036854775808~9223372036854775807 | 19 |
八字节(2^64) | unsigned long long (g++) | 0~18446744073709551615 | 20 |
八字节(2^64) | __int64 (msvc) | -9223372036854775808~9223372036854775807 | 19 |
八字节(2^64) | unsigned __int64 (msvc) | 0~18446744073709551615 | 20 |
为什么要取模,取模前后的值不就变了吗?
确实:取模前 f(43) = 701408733, f(44) = 1134903170, f(45) = 1836311903, 但是 f(46) > 2147483647结果就溢出了。
对齐,取模后 f(43) = 701408733, f(44) = 134903163 , f(45) = 836311896, f(46) = 971215059没有溢出。
大数
1000000007是一个质数(素数),对质数取余能最大程度避免冲突
int32位的最大值为2147483647,所以对于int32位来说1000000007足够大。
int64位的最大值为2^63-1,对于1000000007来说它的平方不会在int64中溢出。
所以在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出
分类:
JAVA
, 算法/algorithm
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体