【文文殿下】【SDOI2013】随机数生成器 题解

2023-11-18

题意

给你个随机数生成器 \(f(x) = a*f(x-1)+b (\mod p)\),给你初始信息\(a,b,t,p,f(1)\),问你几次等于\(t\),如果不等于输出\(-1\).

题解

\[f(n) = a*f(n-1)+b\]

\[f(n) = c*a^{n-1} + \frac {b(a^n-1)}{a-1} \text { where c is an arbitrary parameter} \]

不过上面这个式子咱推不出来,考虑矩阵乘法

\[\begin{pmatrix} a&b\\ 0&1 \end{pmatrix}^x \times \begin{pmatrix} f(1)\\ 1 \end {pmatrix} = \begin{pmatrix} t\\ 1 \end{pmatrix}\]

我们考虑一个BSGS用到矩阵上,就把他做了。
如果你要用这个式子的话
\[a^{i\sqrt{p} + k} = b (\mod p) \]
前面那个转移矩阵的逆矩阵是
\[\begin{pmatrix} \frac{1}{a}&-\frac{b}{a}\\ 0&1 \end{pmatrix} \]

但我懒得用用逆矩阵,直接用下面的这个式子。
\[a^{i\sqrt{p} - k} = b (\mod p) \]

带了矩阵常数贼大,我还懒得手写hashtable,吸着氧过了。
估计思路这么清(zhi)奇(zhang)的人没几个吧。

#include<bits/stdc++.h>
using namespace std;
int p;
int inc(int a,int b) {
    a+=b;
    return a>=p?a-p:a;
}
int dec(int a,int b) {
    a-=b;
    return a<0?a+p:a;
}
int mul(int a,int b) {
    return 1LL*a*b%p;
}
struct qwq {
    int r,c;
    int a[3][3];
    qwq(){
        memset(a,0,sizeof a);
        r=c=0;
    }
    qwq operator * (const qwq& rhs) const {
        qwq ret;
        ret.r = r,ret.c = rhs.c;
        for(int i=1;i<=r;++i) {
            for(int j=1;j<=rhs.c;++j) {
                for(int k=1;k<=c;++k) {
                    ret.a[i][j]=inc(ret.a[i][j],mul(a[i][k],rhs.a[k][j]));
                }
            }
        }
        return ret;
    }
    bool operator < (const qwq& rhs) const {
        if(r!=rhs.r) return r<rhs.r;
        if(c!=rhs.c) return c<rhs.c;
        for(int i=1;i<=r;++i)
            for(int j=1;j<=c;++j)
                if(a[i][j]!=rhs.a[i][j])
                    return a[i][j]<rhs.a[i][j];
        return 0;
    }
};
int T,a,b,x1,t,ans;
qwq qpow(qwq a,int b) {
    assert(b>=0);
    qwq ret;
    ret.r=a.r,ret.c=a.c;
    for(int i=1;i<=ret.r;++i) ret.a[i][i]=1;
    while(b) {
        if(b&1) ret=ret*a;
        a = a * a;
        b>>=1;
    }
    return ret;
}
bool BSGS(void) {
    map<qwq,int> M;
    M.clear();
    int lmt = sqrt(p)+1;
    ans = 0x3f3f3f3f;
    qwq base;
    base.a[1][1]=a,base.a[1][2]=b,base.a[2][2]=1;
    base.r=base.c=2;
    qwq fn;
    fn.r=2,fn.c=1;
    fn.a[1][1]=t,fn.a[2][1]=1;
    qwq st;
    st.r=2,st.c=1;
    st.a[1][1]=x1,st.a[2][1]=1;
    qwq step = qpow(base,lmt);
    for(int i=1;i<=lmt+1;++i) {
        st = step*st;
        if(!M.count(st)) {
            M[st]=i;
        }
    }
    bool flag = 0;
    for(int i=0;i<=lmt;++i) {
        if(i) fn = base*fn;
        if(M.count(fn)) {
            flag = 1;
            ans = min(ans,M[fn]*lmt-i);
        }
    }
    return flag;
}
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d%d%d%d",&p,&a,&b,&x1,&t);
        if(a==0) {
            if(x1==t)
                puts("1");
            else {
                if(b==t) {
                    puts("2");
                }
                else {
                    puts("-1");
                }
            }
        }
        else {
            if(BSGS()) {
                printf("%d\n",ans+1);
            }
            else {
                puts("-1");
            }
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/Syameimaru/p/11066837.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【文文殿下】【SDOI2013】随机数生成器 题解 的相关文章

  • Objective-C中的block

    在Objective C的开发过程中 我们经常用到block 这里就简单总结一下block在Objective C的几种使用方式 1 简单介绍一下block 代码块Block是对C语言的扩展 用来实现匿名函数的特性 Block是一种特殊的数
  • QIIME2-单端数据Deblur

    QIIME2学习 QIIME2分析之单端数据的导入与Deblur 文章目录 QIIME2学习 前言 一 导入数据 查看文件的原始数据的序列数等信息 导出qzv文件查看 二 Deblur 1 按测序碱基质量过滤序列 2 去噪16S过程 3 输
  • 了解 node周边生态

    前言 Node js 周边的生态非常强大 NPM Node包管理 上有超过60万个模块 日下超过载量3亿次 但对新人和其它语言背景的开发者来说 了解node周边生态不是一件容易的事 在入门之前需要弄懂不少复杂的概念 废话不多说 来看看本次分
  • Windows Ubuntu 双系统安装教程

    基本步骤 1 确定自己的硬盘分区 并分区 以我120G固态硬盘 500G机械硬盘的笔记本电脑为例 不打游戏的码农 win用于生活 ubuntu用于工作 C盘 80G固态硬盘 设为ntfs文件格式 用来放Windows系统及相关软件 分区 大
  • Vue中mapbox的使用

    Vue中mapbox的使用 1 首先下载包文件 cnpm i mapbox gl S 2 导入包文件 main js中导入 import mapBoxGl from mapbox gl Vue prototype mapboxgl mapB
  • jwt 私钥_基于JWT的token弱密钥爆破

    JSON Web Token JWT 是目前最流行的跨域身份验证解决方案 直接根据token取出保存的用户信息 以及对token可用性校验 大大简化单点登录 JWT header payload signature 以 相隔 例 eyJhb
  • SpringBoot3基础:最简项目示例

    说明 本文建立一个最基本的SpringBoot3项目 依赖项仅包含 spring web SpringMVC 备注 SpringBoot3需要JDK17支持 配置方法参考 SpringBoot3项目中配置JDK17 项目结构图示 POM
  • 现在学UI设计有前途吗?UI设计收入大概多少

    随着互联网的高速发展以及大量的人奔涌进入UI设计行业 我们发现想要通过UI实现高薪就业变得不再容易 这让很多人担忧 现在学UI设计还有前途吗 千锋郑州UI设计老师从市场需求 就业薪资以及职业发展方向三个角度分析后可以负责的告诉你有前途 UI
  • docke的基础入门

    docker基础入门操作 一 如何安装docker 一 如何安装docker 安装docker命令通过一下命令顺序执行 即可进行安装 校验操作系统内核版本 要求是3 10以上的版本 1 安装一些必要的系统工具 其中yum utils包含yu
  • 由于找不到vcomp140.dll无法继续执行此代码?该怎么修复呢?

    在使用计算机过程中 我们有时会遇到缺少vcomp140 dll文件的问题 这可能导致某些应用程序无法正常运行 遇到了缺少vcomp140 dll文件的问题 这给我的正常工作和娱乐带来了一些困扰 经过一番努力 我成功修复了这个问题 并对此总结
  • shell中括号的特殊用法 linux if多条件判断

    shell中括号的特殊用法 linux if多条件判断 一 bash 单双括号 基本要素 两个符号左右都要有空格分隔 内部操作符与操作变量之间要有空格 如 a b 字符串比较中 gt lt 需要写成 gt lt 进行转义 中字符串或者 变量
  • Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getM的原因及解决办法

    一 原因 从别人那里拿来的gradle项目 然后自己用idea跑的时候报错 Cause org jetbrains plugins gradle tooling util ModuleComponentIdentifierImpl getM
  • linux 解锁用户被锁

    一般我们在开发时部署好了环境 有时候用xshell 登录服务器时我们经常会忘记用户的登录密码 我们经常会遇到用户被锁定 首先 用root 用户查看 查看被锁用户的错误登录次数 pam tally2 u tom tom 为用户 pam tal
  • qt集成cef QWidget

    编译libcef dll wrapper 假设你已经编译出了libcef dll wrapper lib Debug和Release版本 并且对应版本的程序集类型分别是 MDd和MD qt的运行时库是MDd类型的 因此cef3编译的时候也应
  • hive 异常之 MetaException

    直接启动hive后 hive gt show databases FAILED SemanticException org apache hadoop hive ql metadata HiveException java lang Run
  • vue3中对本地存储的数据多次修改并实时页面显示

    背景 项目中遇到切换用户时 对App页面的信息进行实时显示 登录时存储一次 切换时再次存储 解决办法 1 在每次存储的同时存储到pinia中 可解决实时显示问题 import useCommonStore from pinia ls set
  • 软件测试中的43个功能测试点总结

    功能测试就是对产品的各功能进行验证 根据功能测试用例 逐项测试 检查产品是否达到用户要求的功能 针对web系统的常用测试方法如下 1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro
  • C++学习(四八七)android studio println的输出位置

    程序中调用如下输出 System out println haha1 调试情况下 在Run和LogCat下均看不到输出 运行情况下 在Run下能看到输出 建议如下 可在LogCat中看到信息 android util Log常用的方法有以下
  • 蓝牙之十三-HFPclient JNI层

    JNI到app JAVA
  • 开营

    2021未来杯区块链应用创新大赛已于9月24日正式启动 本届大赛是由中国信息协会主办 中国信息协会教育分会 艾肯文化传媒 北京 有限公司 中软国际教育科技集团 以太坊行星承办 北京大学研发实验服务基地 iCAN国际联盟 STEERTECH科

随机推荐

  • echarts修改折线图样式,总结踩坑以及常用

    以折线图为例 最终呈现的效果是这样的 在最外层可以设置 距离外层box的距离 myChart setOption grid 距离外层box左右位置 x 30 左 y 45 上 x2 45 右 y2 40 下 borderWidth 1 在x
  • 【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 在无线传感器网络部署方面 您计划在一个 1
  • React重新渲染的触发机制及其优化策略

    React是一个用于构建用户界面的JavaScript库 它的核心特点之一是使用虚拟DOM Virtual DOM 来实现高效的组件渲染 那组件重新渲染的机制是如何呢 基于这些机制 如果进行优化呢 虚拟DOM是一个用JavaScript对象
  • 逆向破解学习-登山赛车

    试玩 课程中的内容 Hook代码 import de robv android xposed XC MethodHook import de robv android xposed XposedHelpers import de robv
  • React Router 路由守卫

    React Router 路由守卫 组件内路由守卫 1 下面是使用高阶组件实现路由守卫的示例代码 import React from react import Route Redirect from react router dom con
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 奇安信笔试C++

    LSA LSA 链路状态通告 是链接状态协议使用的一个分组 它包括有关邻居和通道成本的信息 LSA被路由器接收用于维护它们的路由选择表 LSA Link State Advertisement ip报文最大长度 单看IP层的话 报文头部的
  • JS实现简单的天、时、分、秒倒计时代码

  • Django版本选择、Python兼容问题及更新时间(长期更新)

    先说结果 LTS是长期支持 Long Term Support 的缩写 是官方长期维护的稳定版本 生产环境建议使用LTS版本 最好最好最好不要尝试其他小更新小修补的版本 不做小白鼠 LTS通常是2年内的单数年4月份更新一次 单次版本维护时间
  • 阶段学习总结

    阶段学习总结 从开始学习java到现在已经过了40多天过去了 同时也学习了java中非常重要的一部分就是面向对象的相关知识 面向对象也是java中较难的一部分 因为它是一种抽象的思想 在这一个阶段的学习中学到了很多以前不解的知识点 同时也有
  • java基础知识

    java基础知识 java是一门编程语言 面向对象 是一门开源的计算机语言 曾用名Oak java市场需求 市面比较广 面向对象 可以开发的方面比较多 主要是是应用方面 android app 软件工具 微信小程序 大数据分析 当今社会上手
  • vector的模拟实现

    vector的模拟实现 include
  • MDM主数据平台使用总结

    随着科技飞速发展的时代 企业信息化建设会越来越完善 越来越体系化 所用到的应用系统也会越来越多 业务发展中沉淀了大量数据 但是这些数据没有为企业带来直观价值 没有形成企业的数据资产 所以越来越多的企业进入到了数据治理阶段 对于主数据治理的需
  • ajax跨域请求 session,浅谈Ajax跨域Session和跨域访问

    浅谈Ajax跨域Session和跨域访问 一 关于ajax跨域请求 用jsonp老是不成功 虽然可以返回数据 但是error处报错 原因是返回的数据格式不是jsonp格式 但是用C 构造的请求却能够返回数据 二 第三方的ajax请求肯定是不
  • centos6.5安装rabbitmq方法------只能用centos6.5

    1 下载最新版本的erlang到文件夹opt中 当前版本是20 0 root localhost opt wget http erlang org download otp src 20 0 tar gz 2 下载完成后查看文件 root
  • STS(Spring Tool Suite)使用前准备

    好了 卖了两个月冰激凌 现在又回来做程序员了 发现好多东西已经忘了 所以拿csdn当个记事本 方便我也方便其他和我有同样问题的人 现在打算用spring mvc来做些东西 工具就用sts STS Spring Tool Suite 其实是个
  • mysql 字符集问题整理

    mysql 字符集问题整理 一直对mysql字符集没有明确的概念 mysql为了方便 设置了各种层级的字符集 最近在移植mat数据库时 顺便把这个问题整理清楚 供参考和学习 文章最后有word版本 有两张图片以及不同文字的颜色区分 首先是M
  • C# 的委托事件实现(含代码)

    参考代码 http www pudn com downloads74 sourcecode windows csharp detail271438 html 最近在看一个抛物线的代码 用C 写的 以前接触C 不多 从代码中可以看到与andr
  • 《Blurriness-guided Unsharp Masking》阅读笔记

    Unsharp Masking 反锐化掩模 将原图像通过反锐化掩模进行模糊预处理 相当于采用低通滤波 后与原图逐点做差值运算 然后乘上一个修正因子再与原图求和 以达到提高图像中高频成分 增强图像轮廓的目的 这篇文章提出了一个基于模糊作为导向
  • 【文文殿下】【SDOI2013】随机数生成器 题解

    题意 给你个随机数生成器 f x a f x 1 b mod p 给你初始信息 a b t p f 1 问你几次等于 t 如果不等于输出 1 题解 f n a f n 1 b f n c a n 1 frac b a n 1 a 1 tex