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)
{
    ll s=0;
    while(y)
    {
        if(y&1)(s+=x)%=m;
        x=(x+x)%m;
        y/=2;
    }
    return s;
}
struct Matrix{
    ll aa[3][3];
    Matrix operator * (const Matrix &y) const
    {
        Matrix x;
        memset(x.aa,0,sizeof x.aa);
        for(int i=1;i<=2;i++)
            for(int k=1;k<=2;k++)
                for(int j=1;j<=2;j++)
                    (x.aa[i][j]+=mul(aa[i][k],y.aa[k][j]))%=m;
        return x;
    }
}ans,s;
int main()
{
    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x,&n,&g);
    s.aa[1][1]=a;s.aa[1][2]=0;
    s.aa[2][1]=c;s.aa[2][2]=1;
    ans.aa[1][1]=1;ans.aa[2][2]=1;
    while(n)
    {
        if(n&1)ans=s*ans;
        s=s*s;
        n/=2;
    }
    printf("%lld",(mul(ans.aa[1][1],x)+ans.aa[2][1])%m%g);
    return 0;
}

原文地址:https://www.cnblogs.com/Zinn/p/9043528.html

时间: 2024-10-11 15:05:43

bzoj2875随机数生成器——矩阵快速幂的相关文章

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

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

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2875 题目居然没给描述,我特么真无语了...好吧我来发个题目描述: 给出a,c,g,mod,x0,n,xn=(a*xn-1+c)%mod,求xn%g 联想用矩阵快速幂在logn的复杂度下求斐波那契数列,对这题我们也可以采取类似的方法. 我们用矩阵运算来改装这个递推式: 设 那么 于是可以直接用矩阵快速幂求A矩阵的n次方,然后再乘上x0即可得出xn 此题还有两个坑点: 1.xn求出

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

HDU 1757 A Simple Math Problem (矩阵快速幂)

[题目链接]:click here~~ [题目大意]: If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); 问f(k)%m的值. [思路]:矩阵快速幂,具体思路看代码吧,注意一些细节. 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; const

Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)

这题想了好长时间,果断没思路..于是搜了一下题解.一看题解上的"快速幂"这俩字,不对..这仨字..犹如醍醐灌顶啊...因为x的范围是10^9,所以当时想的时候果断把dp递推这一方法抛弃了.我怎么就没想到矩阵快速幂呢.......还是太弱了..sad..100*100*100*log(10^9)的复杂度刚刚好. 于是,想到了矩阵快速幂后,一切就变得简单了.就可以把距离<=x的所有距离的点数都通过DP推出来,然后一个快速幂就解决了. 首先DP递推式很容易想到.递推代码如下: for(

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分)

POJ 3233 - Matrix Power Series ( 矩阵快速幂 + 二分) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define MAX_SIZE 30 #define CLR( a, b ) memset( a, b, sizeof(a) ) int MOD = 0; int n, k; st

HDU 4990 Reading comprehension(找规律+矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4990 Problem Description Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include<iostream> #include

hdu 6198(矩阵快速幂)

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 175    Accepted Submission(s): 119 暴力发现当4 12 33 88 232 和斐波那契数列对比  答案为 第2*k+3个数减1 直接用矩阵快速幂求的F[2*k+3]  然后减1 A=1,B=0; 然后矩阵快速幂2*k

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21