news 2026/5/12 14:52:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信息学奥赛一本通 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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 9:39:07

34、UNIX系统进程间通信与网络编程详解

UNIX系统进程间通信与网络编程详解 进程间通信 在UNIX系统中,进程间通信(IPC)是一个重要的话题,下面将详细介绍消息队列、共享内存和信号量这三种常见的IPC机制。 消息队列 消息队列允许进程之间通过发送和接收消息来进行通信。服务器端创建一个新的消息队列,任何人都…

作者头像 李华
网站建设 2026/5/10 4:45:56

35、套接字网络编程指南

套接字网络编程指南 1. 获取本地主机名 在网络编程中,有时需要获取本地主机的名称。可以使用 gethostname 函数来实现: #include <unistd.h> int gethostname(char *name, int len);name :指向用于存储主机名的字符数组。 len :字符数组的大小。 该函数成功…

作者头像 李华
网站建设 2026/4/18 23:53:44

36、UNIX 网络编程中的套接字使用详解

UNIX 网络编程中的套接字使用详解 在 UNIX 系统的网络编程领域,套接字(sockets)是一种广泛应用的网络编程范例,它为网络通信提供了强大而灵活的支持。本文将详细介绍套接字的相关函数、操作以及一些实用的示例,帮助你更好地理解和运用这一技术。 1. 连接套接字 在网络编…

作者头像 李华
网站建设 2026/5/10 12:45:11

诊断式无代码开发:AppSmith企业级应用架构深度解析

诊断式无代码开发&#xff1a;AppSmith企业级应用架构深度解析 【免费下载链接】appsmith appsmithorg/appsmith: Appsmith 是一个开源的无代码开发平台&#xff0c;允许用户通过拖拽式界面构建企业级Web应用程序&#xff0c;无需编写任何后端代码&#xff0c;简化了软件开发流…

作者头像 李华
网站建设 2026/4/29 23:13:22

CVAT终极部署指南:5分钟构建专业级计算机视觉标注平台

CVAT终极部署指南&#xff1a;5分钟构建专业级计算机视觉标注平台 【免费下载链接】cvat Annotate better with CVAT, the industry-leading data engine for machine learning. Used and trusted by teams at any scale, for data of any scale. 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/5/8 0:55:25

PKHeX插件完全指南:解锁宝可梦数据管理终极解决方案

PKHeX插件完全指南&#xff1a;解锁宝可梦数据管理终极解决方案 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 还在为繁琐的宝可梦数据调整而困扰&#xff1f;PKHeX插件集合为你带来革命性的宝可梦数据…

作者头像 李华