首页 > 其他分享 >[SDOI2013] 随机数生成器

[SDOI2013] 随机数生成器

时间:2024-10-22 22:21:47浏览次数:7  
标签:frac int 生成器 define SDOI2013 随机数 a% mod equiv

BSGS对于高阶同余方程的求解
通过题目给出的式子
\(x_{2} \equiv a*x_{1} \mod p\)
\(x_{2}+\frac{b}{a} \equiv a*x_{1}+\frac{b}{a} \mod p\)
\(x_{3}=a*x_{2}+b \equiv (a^2)*x_{1}+a*b+b]\mod p\)
\(对该式子进行继续推导可以得出\)
\(x_{i}=a^{i-1}*x1+\sum_{j=0}^{i-2}a^{j} \mod p\)
\(化简得t \equiv a^{i-1}x_1+\frac{b}{1-a}-\frac{b}{1-a}a^{i-1} \mod p\)
\(继续化简得到 a^{i-1}\equiv \frac{t-\frac{b}{1-a}]}{x_1-\frac{b}{1-a}} \mod p\)
\(接下来我们进行分类讨论\)
1
\(当x_1=t时,直接输出1\)
2
\(当a=0时,x_i=b\)
3
\(当a=1时,有x_i\equiv x_1+b(i-1)\mod p\)

\(这时候我们就要面对高次同余方程\)
\(对于高次同余方程我们一般通过BSGS求解\)
\(接下来讲解BSGS\)

\(由扩展欧拉定理我们可以知道a^{x} \equiv a^{x \mod p} \mod p\)
\(可知其\mod p情况下的最小循环节为f(p)\)
\(因为f(p)<p ,所以考虑x \in [0,p]\)
\(如果暴力枚举,时间为O(p)\)
\(很显然我们无法接受\)
\(令x=im-j,其中m=\lceil \sqrt p \rceil,j \in [0,m-1]\)
\(a^{im-j}\equiv b\mod p\)
\(化简得a^{mi}\equiv ba^{j}\mod p\)
\(先枚举j,把(ba^{j},j)存入哈希表,如果key重复,用更大的j替代\)
\(再枚举i,计算a^{mi}当找到第一个相同的key 那么就找到了最小的 x=im-j\)

\(code:\)

点击查看代码
plaintext
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
int qpw(int a,int b,int mod){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int inv(int x,int mod){
    return qpw(x,mod-2,mod);
}
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
int bsgs(int a,int b,int mod){
    a%=mod,b%=mod;
    unordered_map<int,int>mp;
    int m=ceil(sqrt(mod)),t=b;
    mp[b]=0;
    for(int j=1;j<m;j++){
        t=t*a%mod;
        mp[t]=j;
    }
    int mi=1;
    for(int i=1;i<=m;i++){
        mi=mi*a%mod;
    }
    t=1;
    for(int i=1;i<=m;i++){
        t=t*mi%mod;
        if(mp.count(t)){
            return i*m-mp[t];
        }
    }
    return -1;
}
void solve() {
    int p,a,b,x,t;
    cin>>p>>a>>b>>x>>t;
    if(x==t)cout<<1<<'\n';
    else if(a==1){
        t=((t-x)%p+p)%p;
        if(t%gcd(b,p)){
            cout<<-1<<'\n';
        }else {
            if((t*inv(b,p)+1)%p==0){
                cout<<p<<'\n';
            }else {
                cout<<(t*inv(b,p)+1)%p<<'\n';
            }
        }
    }else if(a==0){
        if(b==t){
            cout<<2<<'\n';
        }else {
            cout<<-1<<'\n';
        }
    }else {
        long long ans = bsgs(a, ((t - b * inv(1 - a, p)) % p + p) % p * inv(((x - b * inv(1 - a, p)) % p + p) % p, p), p) % p;
        if(ans==-1){
            cout<<-1<<'\n';
        }else cout<<ans+1<<'\n';
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
    cin>>_;
    while(_--)solve();
}

标签:frac,int,生成器,define,SDOI2013,随机数,a%,mod,equiv
From: https://www.cnblogs.com/archer233/p/18493953

相关文章

  • 基于 Streamlit 工具开发的创意故事生成器
    以下是对上面运行代码的详细说明:主要构建了一个基于 streamlit 库的创意故事生成器应用程序。首先,引入了 streamlit 库。然后,使用 st.markdown 函数设置了一个居中的标题 创意故事生成器 。接下来,定义了一个名为 validate_input 的函数,用于检查输入字符串是......
  • 自动执行generator生成器函数
    自动执行generator函数◼目前我们的写法有两个问题:第一,我们不能确定到底需要调用几层的Promise关系;第二,如果还有其他需要这样执行的函数,我们应该如何操作呢?◼所以,我们可以封装一个工具函数execGenerator自动执行生成器函数<script>//封装一个请求方法......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • Generator(生成器)
    ◼生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行等。平时我们会编写很多的函数,这些函数终止的条件通常是返回值或者发生了异常。◼生成器函数也是一个函数,但是和普通的函数有一些区别:首先,生成器函数需要在f......
  • P11211 随机数生成器 题解
    前置知识:原根,exCRT。首先\(t=1\)是容易的,直接相邻的除一下即可。否则考虑询问除连续的\(5\)个数,分别为\(a_0,a_1,\cdots,a_4\)。首先特判掉存在\(a_i=0\)的情况,此时直接枚举\(s\)即可。我们先求出\(p\)的一个原根\(g\),设离散对数\(\log(x)=y\)表示\(g^y\equiv......
  • 可迭代对象、迭代器、生成器
    可迭代对象如果实现了__iter__方法,就认为对象是可迭代的.使用内置的iter函数可以获取迭代器的对象.检查对象x是否为迭代器,最好的方式是调用isinstance(x,abc.Iterator)序列都是可迭代的迭代器(Iterator):迭代器是一个对象,它实现了iter()和next()两个基本方法。ite......
  • 10.18Python基础迭代器生成器_函数式编程
    Python迭代器与生成器1.迭代器Iterator什么是迭代器迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用,而不会像列表那样在迭代时被修改。迭代器函数iter和next函数说明iter(iterable)从可迭代对象中返回一个迭代器,iterabl......
  • java代码生成器(controller,service,mapper)
    packagecom.cn.codeGenerator;importjava.awt.*;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;publicclassCodeGenerator{privatestaticfinalStri......
  • 18.Python基础篇-迭代器、生成器
    函数进阶-迭代器 双下方法:很少直接调用,一般情况下,都是通过其他语法触发的(Python解释器调用的方法)可迭代协议 与迭代器协议可迭代的iterable与迭代器iter可迭代协议:含有__iter__方法的都是可迭代的。可迭代的,一定可以被for循环。只要含有__iter__()方法能被for循环。......
  • 17.Python基础篇-闭包、装饰器、迭代器、生成器
    函数的进阶—闭包闭包的定义:嵌套函数,内部函数调用外部函数的变量。满足这个条件就算闭包。闭包案例演示:defouter():a=1definner():print('inner函数中打印的变量a:',a)#嵌套函数中使用了外层函数的变量。此时满足了闭包的条件。returninner......