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

UVa 408 Uniform Generator

题目描述

题目涉及一种伪随机数生成器,其递推公式为:

seed(x+1)=[seed(x)+STEP]%MOD \textit{seed}(x + 1) = [\textit{seed}(x) + \textit{STEP}] \% \textit{MOD}seed(x+1)=[seed(x)+STEP]%MOD

其中%\%%为取模运算符。该生成器会产生000MOD−1\textit{MOD} - 1MOD1之间的伪随机数序列。如果STEP\textit{STEP}STEPMOD\textit{MOD}MOD选择得当,该序列可以在MOD\textit{MOD}MOD次迭代内生成000MOD−1\textit{MOD} - 1MOD1之间的所有整数,从而实现均匀分布。

例如,STEP=3\textit{STEP} = 3STEP=3MOD=5\textit{MOD} = 5MOD=5时,序列为0,3,1,4,20, 3, 1, 4, 20,3,1,4,2,覆盖了000444的所有数字。而STEP=15\textit{STEP} = 15STEP=15MOD=20\textit{MOD} = 20MOD=20时,序列为0,15,10,5,…0, 15, 10, 5, \ldots0,15,10,5,,无法覆盖所有数字。

本题要求判断给定的STEP\textit{STEP}STEPMOD\textit{MOD}MOD是否能生成均匀分布的伪随机数序列。

输入格式

输入包含多行,每行两个整数STEP\textit{STEP}STEPMOD\textit{MOD}MOD1≤STEP,MOD≤1000001 \le \textit{STEP}, \textit{MOD} \le 1000001STEP,MOD100000)。

输出格式

对于每行输入,输出三部分:

  • STEP\textit{STEP}STEP值,右对齐占第111101010列。
  • MOD\textit{MOD}MOD值,右对齐占第111111202020列。
  • 从第252525列开始,左对齐输出Good Choice\texttt{Good Choice}Good ChoiceBad Choice\texttt{Bad Choice}Bad Choice

每组输出后跟一个空行。

样例

输入

3 5 15 20 63923 99999

输出

3 5 Good Choice 15 20 Bad Choice 63923 99999 Good Choice

题目分析

本题的核心是判断线性同余生成器xn+1=(xn+STEP) mod MODx_{n+1} = (x_n + \textit{STEP}) \bmod \textit{MOD}xn+1=(xn+STEP)modMOD是否具有最大周期MOD\textit{MOD}MOD,即能否在MOD\textit{MOD}MOD次迭代内生成000MOD−1\textit{MOD} - 1MOD1的所有整数。

周期条件

从初始值000开始,序列为:
0, STEP mod MOD, 2×STEP mod MOD, 3×STEP mod MOD, … 0,\ \textit{STEP} \bmod \textit{MOD},\ 2 \times \textit{STEP} \bmod \textit{MOD},\ 3 \times \textit{STEP} \bmod \textit{MOD},\ \ldots0,STEPmodMOD,2×STEPmodMOD,3×STEPmodMOD,

一般项为k×STEP mod MODk \times \textit{STEP} \bmod \textit{MOD}k×STEPmodMOD。该序列的周期等于满足k×STEP≡0(modMOD)k \times \textit{STEP} \equiv 0 \pmod{\textit{MOD}}k×STEP0(modMOD)的最小正整数kkk,即MOD/gcd⁡(STEP,MOD)\textit{MOD} / \gcd(\textit{STEP}, \textit{MOD})MOD/gcd(STEP,MOD)

因此,序列能生成所有MOD\textit{MOD}MOD个不同余数的充要条件是:
MODgcd⁡(STEP,MOD)=MOD⟺gcd⁡(STEP,MOD)=1 \frac{\textit{MOD}}{\gcd(\textit{STEP}, \textit{MOD})} = \textit{MOD} \quad \Longleftrightarrow \quad \gcd(\textit{STEP}, \textit{MOD}) = 1gcd(STEP,MOD)MOD=MODgcd(STEP,MOD)=1

也就是说,STEP\textit{STEP}STEPMOD\textit{MOD}MOD互质时,生成器是均匀的;否则不是。

数学解释

线性同余生成器xn+1=(xn+a) mod mx_{n+1} = (x_n + a) \bmod mxn+1=(xn+a)modm的周期等于m/gcd⁡(a,m)m / \gcd(a, m)m/gcd(a,m)。这是因为每次增加aaa,相当于在模mmm的加法群中移动。群中由aaa生成的子群的大小为m/gcd⁡(a,m)m / \gcd(a, m)m/gcd(a,m)。只有当gcd⁡(a,m)=1\gcd(a, m) = 1gcd(a,m)=1时,该子群才是整个群,周期达到最大值mmm

算法实现

对于每组STEP\textit{STEP}STEPMOD\textit{MOD}MOD,使用欧几里得算法计算最大公约数:

  • gcd⁡(STEP,MOD)=1\gcd(\textit{STEP}, \textit{MOD}) = 1gcd(STEP,MOD)=1,输出Good Choice\texttt{Good Choice}Good Choice
  • 否则,输出Bad Choice\texttt{Bad Choice}Bad Choice

注意输出格式:STEP\textit{STEP}STEPMOD\textit{MOD}MOD各占101010列宽度,右对齐;然后输出444个空格;最后输出判断结果。每组输出后需打印一个空行。

复杂度分析

每组数据使用欧几里得算法求最大公约数,时间复杂度O(log⁡min⁡(STEP,MOD))O(\log \min(\textit{STEP}, \textit{MOD}))O(logmin(STEP,MOD)),完全可接受。

代码实现

// Uniform Generator// UVa ID: 408// Verdict: Accepted// Submission Date: 2016-07-16// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intSTEP,MOD;while(cin>>STEP>>MOD){cout<<setw(10)<<right<<STEP;cout<<setw(10)<<right<<MOD;cout<<string(4,' ');inttemp,a=STEP,b=MOD;while(a%b)temp=a,a=b,b=temp%b;if(b==1)cout<<"Good Choice\n\n";elsecout<<"Bad Choice\n\n";}return0;}
http://www.rkmt.cn/news/1471948.html

相关文章:

  • Android 11适配踩坑实录:从存储权限到软件包可见性,一个老项目的完整升级日记
  • 从IEEE 1149.1标准到芯片调试:深入理解JTAG状态机背后的设计哲学
  • 2026年成都权威保温岩棉板厂家实力排行一览:成都离心玻璃棉/成都管道玻璃棉/成都防火岩棉板/实力盘点 - 优质品牌商家
  • 电子设计能力五重境界:从功能实现到稳健设计的进阶之路
  • 别再只装主程序了!CARSIM2020第三方驱动与PDF阅读器的安装选择,到底怎么勾选?
  • 3分钟解锁《星露谷物语》XNB资源修改:从零到模组大师的终极指南
  • 别再当‘炼丹师’了!用PyTorch和TensorBoard可视化你的CNN,看看模型到底‘看’到了什么
  • pandas多维聚合生产实践:从groupby到可运维分析
  • 从Self-Attention到External Attention:我如何用这个新模块给老CV模型‘续命’
  • 告别工程打架:手把手教你设计DSP双工程跳转框架,防止程序“鬼打墙”
  • 手把手教你用Cadence/Synopsys VIP加速SoC验证(附自研VIP开发避坑指南)
  • Mistral 8×7B SMoE架构深度解析:稀疏激活与专家分工的工程实现
  • MATLAB调用电脑摄像头报错?手把手教你安装图像采集工具箱硬件支持包(保姆级图文)
  • 富士通MB91580与MB86R11芯片:HV/EV电机控制与智能座舱显示实战解析
  • SolidWorks宏录制完只有.swp文件?别急,手把手教你找回C#/VB.NET项目格式
  • FPGA双向端口(inout)设计实战:三态门原理与Verilog实现详解
  • 从SolidWorks模型到Gazebo仿真:你的URDF文件还缺了哪些关键配置?
  • 工程师必备:高级搜索语法实战指南,精准挖掘技术文档与资源
  • 别再只调休眠了!STM32L431低功耗调试全记录:STOP2模式唤醒后外设(串口/I2C)异常恢复指南
  • 给水排水工程师的EPANET入门:从零开始搭建第一个管网水力模型(含Python接口预告)
  • DDrawCompat完整指南:让Windows 11流畅运行经典DirectX老游戏
  • STM32F103上跑mbedtls加密:从SHA1测试到MQTTS实战避坑指南
  • 别再乱设align_corners了!PyTorch和TensorFlow上采样实战避坑指南(附代码对比)
  • 从设计稿到上线:手把手教你用uni-app封装一个高复用、可配置的“凸起TabBar”组件库
  • 从零开始手把手教你分析MOS单级放大器:共源、共栅、源随器到底怎么算增益?
  • 消费级脑机接口实战:用EEG+EMG+EOG搭建可运行的意念输入系统
  • STM32F407的TFTP升级踩坑实录:从LWIP配置、Tftpd64工具到Wireshark抓包分析全攻略
  • 计算机毕业设计之基于web的废旧塑料交易系统的设计与实现
  • 安全开发自查清单:从Pikachu的Post反射XSS漏洞,反推5个后端过滤与前端渲染的避坑要点
  • PASCAL VOC2012数据集里的‘人’:从行为识别到实例分割,一份数据如何玩转多个CV任务?