zoukankan      html  css  js  c++  java
  • 题解 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;
    }
    

    就这样,谢谢啦

  • 相关阅读:
    基于 Spring Cloud 的微服务架构实践指南(上)
    1分钟,带你上手“Markdown”语法
    Spring Cloud 理论篇
    如何设计一个优雅的RESTFUL的接口
    简简单单之Linux命令入门
    SpringBoot基础架构篇3(Redis)
    SpringBoot基础架构篇1(SpringBoot、MyBatis-Plus与Thymeleaf)
    基础之Lambda和Stream的邂逅
    浏览器如何执行JS
    渲染进程里的线程
  • 原文地址:https://www.cnblogs.com/XSZCaesar/p/10549450.html
Copyright © 2011-2022 走看看