【NOI2012】随机数生成器

2024-05-29 03:08
文章标签 生成器 随机数 noi2012

本文主要是介绍【NOI2012】随机数生成器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

栋栋最近迷上了随机算法,而随机数生成是随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数 m, a, c, X0,按照下面的公式生成出一系列随机数:

Xn+1=(aXn+c) mod m

其中 mod m 表示前面的数除以m的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。

用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的 C++和 Pascal 的产生随机数的库函数使用的也是这种方法。

栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道Xn是多少。由于栋栋需要的随机数是0, 1, … ,n−1 之间的,他需要将 Xn 除以g取余得到他想要的数,即 Xn mod g,你只需要告诉栋栋他想要的数Xn mod g是多少就可以了。

Input

输入中包含 6 个用空格分割的整数m, a, c, X0, n和g,其中a, c, X0是非负整数,m, n, g是正整数。

Output

输出一个数,即Xn mod g

Sample Input

11 8 7 1 5 3

Sample Output

2

Solution

n<=1018 很显然的矩阵乘法
用输入中的变量
矩阵大小为2*2,由[x0 c]转移到[x1 c]以此类推
矩阵为

[a101](1)

[x0c](2)

将(1)n次方后与(2)相乘就会得到[xn c]

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define fo(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
ll mo,x,n,g,a[2][2],b[2][2],c[2][2],y;
ll cheng(ll x,ll y)
{
    if(y==0) return 0;
    if(y==1) return x;
    ll z=cheng(x,y/2);
    z=(z+z)%mo;
    if(y%2==0) return z;
    else return (z+x)%mo;
}
void fz()
{
    fo(i,0,1) fo(j,0,1) c[i][j]=a[i][j],a[i][j]=0;
}
void ch1()
{
    fz();
    fo(i,0,1) fo(j,0,1) fo(k,0,1) (a[i][k]+=cheng(c[i][j],c[j][k]))%=mo;
}
void ch2()
{
    fz();
    fo(i,0,1) fo(j,0,1) fo(k,0,1) (a[i][k]+=cheng(b[i][j],c[j][k]))%=mo;
}
void dg(ll n)
{
    if(n==1) return;
    dg(n/2);
    ch1();
    if(n%2==1) ch2();
}
int main()
{
    freopen("random.in","r",stdin);
    freopen("random.out","w",stdout);
    scanf("%lld%lld%lld%lld%lld%lld",&mo,&a[0][0],&y,&x,&n,&g);
    a[0][1]=0;a[1][1]=a[1][0]=1;
    fo(i,0,1) fo(j,0,1) b[i][j]=a[i][j];
    dg(n);
    b[0][0]=x;b[0][1]=y;b[1][0]=b[1][1]=0;
    ch2();
    printf("%lld",a[0][0]%g);
}

这篇关于【NOI2012】随机数生成器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012473

相关文章

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

纸牌函数生成器

此模板用来生成纸牌类的测试数据,本人手打,不合理或缀余的地方希望大神指出。 T=10000(测试数据组数), t (两摞相等的牌,每摞牌的数量); 每张牌用A,2~9,T,J,Q,K;表示牌面大小; 用S,H,C,D;表示花色。 共52张牌。 #include<stdio.h>#include<time.h>#include<stdlib.h>#include<string.

【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程酒吧一群美女车展模特大屏幕视频改字AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

[Python]生成器和yield关键字

生成器和yield关键字 1.生成器介绍: 概述: ​ 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式… 作用: ​ 降低资源消耗, 快速(批量)生成数据. 实现方式: ​ 1.推导式写法. my_generator = (i for i in range(5)) ​ 2.yield写法. def get_generator():for i

Mybatis自动生成器的使用方式

文章目录 编写generator配置文件配置maven插件第一种启动方式第二种启动方式 编写generator配置文件 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration

【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程豪车劳斯莱斯库里南中控改名软件AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 修改图片或文字 渲染出视频

【Python知识宝库】迭代器与生成器:高效处理大数据集

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、迭代器:逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器:按需生成数据的魔法1. 生成器的定义2. 创建生成器生成器函数生成器表达式 3. 生成器的优势 三、迭代器和生成器在处理

Java生成随机数工具类,进制之间的转换工具类,获取指定时间,时间格式转换工具类

废话不多说,贡献一下code 1.编号生成工具 import org.apache.commons.lang3.StringUtils;import java.math.BigInteger;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;/*** 编号生成工具*/@