bzoj2875随机数生成器

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875

矩阵乘裸题。

如果直接乘的话会爆long long,所以用加法代替乘,过程中不断取模。

加法应是快速乘,不要O(n)循环……

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,g,a,c,ans,x;
ll mul(ll u,ll v)
{
    ll ret=0,tp=u;
    while(v)
    {
        if(v&1)(ret+=tp)%=m;
        (tp+=tp)%=m;v>>=1;
    }
    return ret;
}
struct Matrix{
    ll v[2][2];
    Matrix operator *(const Matrix &b)const
    {
        Matrix tp;memset(tp.v,0,sizeof tp.v);
        for(int i=0;i<=1;i++)
            for(int j=0;j<=1;j++)
                for(int k=0;k<=1;k++)
                    (tp.v[i][j]+=mul(v[i][k],b.v[k][j]))%=m;
        return tp;
    }
}res,ct;
void init()
{
    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x,&n,&g);
    n--;
    res.v[0][0]=a;res.v[0][1]=1;
    res.v[1][0]=0;res.v[1][1]=1;
    memcpy(ct.v,res.v,sizeof res.v);
}
int main()
{
    init();
    while(n)
    {
        if(n&1)res=res*ct;
        ct=ct*ct;n>>=1;
    }
    ans=(mul(res.v[0][0],x)+mul(res.v[0][1],c))%m%g;
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/9043488.html

时间: 2024-10-10 20:24:34

bzoj2875随机数生成器的相关文章

bzoj2875随机数生成器——矩阵快速幂

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵快速幂,把x和c开求,最后加上即可: 为防止爆long long,要用快速乘. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll n,x,a,c,m,g; ll mul(ll x,ll y) {

【矩阵乘】【NOI 2012】【cogs963】随机数生成器

963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列.这样的方法须要设置四个非负整数參数m,a,c,X[0],依照以下的公式生成出一系列随机数{Xn}: X[n+1]=(aX[n]+c) mod m 当中mod

BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

矩阵快速幂...+快速乘就OK了 -------------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long long ll; ll MOD, a, c, x, n, g; ll MUL(ll a, ll b) { ll ans = 0; for(; b; b >>= 1

C语言下泊松分布以及指数分布随机数生成器实现

最近实验室的项目需要实现模拟文件访问序列,要求单位时间内的数据请求次数符合泊松分布,而两次请求见的时间间隔符合指数分布.没办法只好重新捡起已经丢掉多时的概率知识.于是也就有了这篇关于在C语言下符合泊松分布和指数分布的随机数生成器的实现. 泊松分布 在实际的事例中,当某一事件,比如进站乘客数量,电话交换机接收到的通话请求以固定的瞬时速率λ独立且随机地出现时,就可以认为该事件在单位时间内发生的次数符合泊松分布. 首先必须由二项分布引出: 如果做一件事情成功的概率是 p 的话,那么独立尝试做这件事情

浅谈随机数生成器及其应用

[导读] 相信来看的读者一定知道在stdlib.h中的rand(),开始觉得它是一个很神奇的东西,绞尽脑汁都想不出它是如何做到的,于是查了下资料知道了如下几点 Windows随机函数产生的随机数不是真正意义下的随机数,而是通过一个随机数种子,然后一些公式,不断地得到下一个"随机数",然后将种子改成这个随机数,然后再不断这样继续. 通过单纯的编程很难得到一个真正的随机函数,UNIX系统下一个随机函数是通过硬件的信息(例如硬件发出的噪音)等等来得到的随机数. 所以经常会出现这样的情况 然后

【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <map&

Linux的两种随机数生成器

Linux下有两个特殊设备文件/dev/random和/de/urandom,用于生成随机数. /dev/random生成的随机数与当前使用的计算机硬件状态相关,提高了安全性,非常适合对随机数质量要求很高的场景.但是,如果硬件状态改变不足以提供足够多的信息给这个随机数生成器,读它产生的随机数的程序就会block住,一直等到有足够多的硬件状态改变导致数据生成为止. /dev/urandom又称为"无限"或者"非堵塞"("unlimited"[5]/

【BZOJ-3122】随机数生成器 BSGS

3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Status][Discuss] Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Output 共T行,每行一个整数表示他最早读到第t页是

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)

文中的 Random即:java.util.Random,ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandomSecureRandom即:java.security.SecureRandom Q:Random是不是线程安全的?A:Random是线程安全的,但是多线程下可能性能比较低.参考:http://docs.oracle.com/javase/7/docs/api/java/util/Random.htmlhttp://stac