题解 P2044 【[NOI2012]随机数生成器】

诸位大佬都好强啊

其实蒟蒻的我看到题的第一眼想法就是矩乘啊

后来懒惰求知欲强的我就抱着学习yy一下的心理看一看题解

。。。。。。

。。。。。。

看不懂 自己推吧

就把那个乘上那个,和那个,这个,那样一下就好了。

咳咳

就这样吧:



对于蒟蒻的我来说矩乘和快速幂还是可以的:乘号写成加号什么的


#include<bits/stdc++.h>

using namespace std;

struct node
{
    int x,y;
    long long s[4][4];
};
long long n,m,a,c,g,x0;
node ans,onc;
node multi(node x,node y)
{
    node z;
    z.x=x.x,z.y=y.y;
    for(register int i=1;i<=z.x;i++)
    {
        for(register int j=1;j<=z.y;j++)
        {
            z.s[i][j]=0;
            for(register int k=1;k<=x.y;k++)z.s[i][j]=(z.s[i][j]%m+x.s[i][k]%m*y.s[k][j]%m)%m;
        }
    }
    return z;
}
void quick_pow(long long p)
{
    while(p!=0)
    {
        if(p%2==1)ans=multi(ans,onc);
        onc=multi(onc,onc);
        p=p/2;
    }
}
int main()
{
    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
    ans.x=1,ans.y=2;
    ans.s[1][1]=x0,ans.s[1][2]=1;
    onc.x=2,onc.y=2;
    onc.s[1][1]=a,onc.s[1][2]=0,onc.s[2][1]=c,onc.s[2][2]=1;
    quick_pow(n);
    printf("%lld",ans.s[1][1]%g);
    return 0;
}

而后狂 WA 不止

还是题解强

要快速乘防炸的


#include<bits/stdc++.h>

using namespace std;

struct node
{
    int x,y;
    long long s[4][4];
};
long long n,m,a,c,g,x0;
node ans,onc;
long long quick_mul(long long a,long long b,long long p)
{
    long long ret=0;
    while(b)
    {
        if(b&1)ret=(ret+a)%p;
        a=2*a%p;
        b>>=1;
    }
    return ret;
}
node multi(node x,node y)
{
    node z;
    z.x=x.x,z.y=y.y;
    for(register int i=1;i<=z.x;i++)
    {
        for(register int j=1;j<=z.y;j++)
        {
            z.s[i][j]=0;
            for(register int k=1;k<=x.y;k++)z.s[i][j]=(z.s[i][j]%m+quick_mul(x.s[i][k]%m,y.s[k][j]%m,m))%m;
        }
    }
    return z;
}
void quick_pow(long long p)
{
    while(p!=0)
    {
        if(p%2==1)ans=multi(ans,onc);
        onc=multi(onc,onc);
        p=p/2;
    }
}
int main()
{
    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
    ans.x=1,ans.y=2;
    ans.s[1][1]=x0,ans.s[1][2]=1;
    onc.x=2,onc.y=2;
    onc.s[1][1]=a,onc.s[1][2]=0,onc.s[2][1]=c,onc.s[2][2]=1;
    quick_pow(n);
    printf("%lld",ans.s[1][1]%g);
    return 0;
}

就这样,谢谢啦

原文地址:https://www.cnblogs.com/XSZCaesar/p/10549450.html