小知识(2)同余/大数(入门)
处理大数可以用同余。
公式:
(a*b)%c = ((a%c)*(b%c))%c
(a+b)%c = ((a%c)+(b%c))%c
http://www.fjutacm.com/Problem.jsp?pid=2424
简单的同余,直接用就行了。
然后一般可以按位读入取模。
http://www.fjutacm.com/Problem.jsp?pid=2422
简单的按位读入取模。
#include<stdio.h> #include<string.h> int main() { int n,b,m,y; char a[1001]; int c[1001]; while(~scanf("%s %d",a,&b)) { m=strlen(a); y=(a[0]-'0')%b; c[0]=a[0]-'0'; for(int i=0;i<m-1;i++) { y=(c[i]*10+(a[i+1]-'0'))%b; c[i+1]=y; } printf("%d\n",y); } return 0; }
http://www.fjutacm.com/Problem.jsp?pid=2419
这个也不难。
http://www.fjutacm.com/Problem.jsp?pid=2473
这个......我第一次硬算t了,在大佬的嘲讽下知道了直接用公式。
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int main() { long long n,m,y; while(~scanf("%lld%lld",&n,&m)) { double x=(n+sqrt(n*n-4*__gcd(n,m)*m))/2.0; y=x; if(x==y) printf("%lld %lld\n",n-y,y); else puts("No Solution"); } return 0; }
好的我承认我就是傻逼
更深入的还没有具体了解,先码一下(大数乘法):
- 模拟乘法:最简单的乘法竖式手算的累加型;
- 分治乘法:最简单的是Karatsuba乘法,一般化以后有Toom-Cook乘法;
- 快速傅里叶变换FFT:(为了避免精度问题,可以改用快速数论变换FNTT),时间复杂度O(N lgN lglgN)。具体可参照Schönhage–Strassen algorithm;
- 中国剩余定理:把每个数分解到一些互素的模上,然后每个同余方程对应乘起来就行;
- Furer’s algorithm:在渐进意义上FNTT还快的算法。
码题时间:http://poj.org/problem?id=1001(求高精度幂)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义