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

信息学奥赛一本通 1640:C Looooops

【题目链接】

ybt 1640:C Looooops
LOJ 10218. 「一本通 6.4 练习 4」C Looooops

【题目考点】

1. 线性同余方程

相关知识见 【模板】洛谷 P1082 [NOIP 2012 提高组] 同余方程

【解题思路】

在C或C++的k kk位存储系统,可以存储[ 0 , 2 k − 1 ] [0, 2^k-1][0,2k1]范围内的整数。如unsigned int类型的范围为[ 0 , 2 32 − 1 ] [0, 2^{32}-1][0,2321],unsigned long long类型的范围为[ 0 , 2 64 − 1 ] [0, 2^{64}-1][0,2641]
当变量的数值超出了该数据类型可以表示的范围,会发生“自然溢出”,变量在二进制下只会保留末k kk位,在数值角度看相当于进行了m o d 2 k \bmod 2^kmod2k操作。
for (variable = A; variable != B; variable += C)
该代码的意义为:变量初值为A,每次循环变量的值增加C,当变量的值等于B时跳出循环。
假设进行了x xx次循环,则有A + x C m o d 2 k = B A+xC \bmod 2^k = BA+xCmod2k=B
或列成同余方程A + x C ≡ B ( m o d 2 k ) A+xC\equiv B \pmod{2^k}A+xCB(mod2k)
整理得C x ≡ B − A ( m o d 2 k ) Cx\equiv B-A \pmod{2^k}CxBA(mod2k)

  • 如果g c d ( C , 2 k ) ∣ ( B − A ) gcd(C, 2^k)\mid (B-A)gcd(C,2k)(BA),则该方程有解,通过扩展欧几里得算法求线性同余方程的解。
    -如果g c d ( C , 2 k ) ∤ ( B − A ) gcd(C, 2^k)\nmid (B-A)gcd(C,2k)(BA),则该方程无解,即无论进行几次循环,变量的值都无法等于B BB,输出FOREVER。

【题解代码】

解法1:扩展欧几里得算法直接求解线性同余方程
#include<bits/stdc++.h>usingnamespacestd;#defineN25#defineMOD(a,b)(((a)%(b)+(b))%(b))typedeflonglongLL;voidexgcd(LL a,LL b,LL&x,LL&y,LL&g){if(b==0){x=1,y=0,g=a;return;}exgcd(b,a%b,y,x,g);y-=a/b*x;}intmain(){LL a,b,c,k,x,y,g;while(cin>>a>>b>>c>>k&&!(a==0&&b==0&&c==0&&k==0)){exgcd(c,1LL<<k,x,y,g);if((b-a)%g==0)cout<<MOD(x*(b-a)/g,(1LL<<k)/g)<<endl;elsecout<<"FOREVER"<<endl;}return0;}
解法2:先求乘法逆元再解线性同余方程
#include<bits/stdc++.h>usingnamespacestd;#defineN25#defineMOD(a,b)(((a)%(b)+(b))%(b))typedeflonglongLL;voidexgcd(LL a,LL b,LL&x,LL&y){if(b==0){x=1,y=0;return;}exgcd(b,a%b,y,x);y-=a/b*x;}LLgcd(LL a,LL b){if(b==0)returna;returngcd(b,a%b);}LLinv(LL a,LL m){LL x,y;exgcd(a,m,x,y);returnMOD(x,m);}intmain(){LL a,b,c,k,x,y,g;while(cin>>a>>b>>c>>k&&!(a==0&&b==0&&c==0&&k==0)){g=gcd(c,1LL<<k);if((b-a)%g==0)cout<<MOD((b-a)/g*inv(c,1LL<<k),(1LL<<k)/g)<<endl;elsecout<<"FOREVER"<<endl;}return0;}
http://www.jsqmd.com/news/86492/

相关文章:

  • Gitee运用笔记
  • 39、使用 TLI 进行网络编程
  • 40、UNIX网络编程中的TLI与杂项例程
  • 终极指南:3步解决Armbian音频配置难题
  • 41、UNIX 系统中的常用算法与函数详解
  • 42、UNIX 系统杂项编程实用指南
  • VideoDownloadHelper终极使用指南:轻松下载网络视频的完整教程
  • 43、UNIX编程:正则表达式、国际化与ANSI C的变革
  • 腾讯开源SongGeneration:用AI技术让每个人都能创作专业级音乐
  • 44、ANSI C 特性与文件系统数据访问
  • 45、UNIX文件系统数据结构访问详解
  • 腾讯开源Hunyuan-7B-Instruct-AWQ-Int4:轻量化大模型部署新时代
  • ScienceDecrypting:学术文献格式转换的终极解决方案
  • 47、《/proc文件系统与伪终端技术解析》
  • OpenRGB技术深度解析:跨平台硬件灯光统一控制解决方案
  • PvZWidescreen:让经典游戏完美适配现代宽屏显示器
  • Cmder完整使用指南:打造Windows最强命令行终端
  • 2025效率革命:Qwen3-8B-AWQ双模式切换重塑企业AI部署范式
  • ElasticJob云原生部署终极指南:分布式任务调度的完整解决方案
  • AndroidGen-GLM-4-9B:无标注训练开启安卓智能体自动化新时代
  • 3D建模革命:nerfstudio与Blender自动化流程重塑创作效率
  • CVAT终极部署指南:5分钟构建专业级计算机视觉标注平台
  • GLM-4.6技术深度解析:200K上下文窗口如何重塑企业级AI应用场景
  • BG3ModManager终极指南:轻松打造专属博德之门3游戏体验
  • 如何构建高性能移动端下载引擎:架构优化深度解析
  • 快速上手DellFanManagement:免费开源风扇控制工具完全指南
  • debug.js调试工具完整使用指南
  • 终极iOS评论系统:5大核心功能深度解析与实战指南
  • 从零到一:nerfstudio让普通人也能玩转3D建模的终极指南
  • 53、Ext2和Ext3文件系统详解