zoukankan      html  css  js  c++  java
  • BZOJ 3122 随机数生成器

    其实我觉得直接矩阵BSGS也可以做?

    推下式子。。。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #include<cmath>
    using namespace std;
    long long T,mod,a,b,x1,t,p,q,r,x,y;
    map <long long,long long> mp;
    long long f_pow(long long a,long long b)
    {
        long long ans=1,base=a;
        while (b)
        {
            if (b&1) ans=(ans*base)%mod;
            base=(base*base)%mod;
            b>>=1;
        }
        return ans;
    }
    long long exgcd(long long a,long long b,long long &x,long long &y)
    {
        if (b==0)
        {
            x=1;y=0;
            return a;
        }
        long long d=exgcd(b,a%b,x,y);
        long long t=x;
        x=y;y=t-(a/b)*y;
        return d;
    }
    long long BSGS()
    {
        mp.clear();
        if (p==r) return 0;
        long long m=(long long)(sqrt(1.0*mod)+1),base=r;
        for (long long i=0;i<m;i++)
        {
            mp[base]=i;
            base=(base*q)%mod;
        }
        long long tmp=f_pow(q,m);base=(tmp*p)%mod;
        for (long long i=1;i<=m+1;i++)
        {
            if (mp.count(base)) return i*m-mp[base];
            base=(base*tmp)%mod;
        }
        return -2;
    }
    int main()
    {
        scanf("%lld",&T);
        for (long long i=1;i<=T;i++)
        {
            scanf("%lld%lld%lld%lld%lld",&mod,&a,&b,&x1,&t);
            if (x1==t) printf("1
    ");
            else if (!a)
            {
                if (b==t) printf("2
    ");
                else printf("-1
    ");
            }
            else if (a==1)
            {
                long long d=exgcd(b,mod,x,y);
                p=(t-x1+b+mod)%mod;
                if (p%d) printf("-1
    ");
                else
                {
                    if (x<0) x+=mod;
                    x=(x*(p/d))%mod;if (!x) x=mod;
                    printf("%d
    ",x);
                }
            }
            else
            {
                p=x1*(a-1)+b;p%=mod;
                q=a;q%=mod;
                r=(t*(a-1)+b)%mod;
                printf("%lld
    ",BSGS()+1);
            }
        }
        return 0;
    }
  • 相关阅读:
    使用jQuery对象
    jQuery插件
    使用jQuery函数
    jQuery的两把利器
    初始jQuery
    BOM——特效
    BOM的介绍
    DOM——节点操作
    miaov- 自动生成正V反V大于号V小于号V楼梯等图案
    H5 -- 本地存储计数器的值 和前端校验用户
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5960123.html
Copyright © 2011-2022 走看看