zoukankan      html  css  js  c++  java
  • BZOJ 2242 计算器

    该模的要模,该特判的要特判。。。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #include<cmath>
    using namespace std;
    map <long long,long long> mp;
    long long t,k,y,z,p,x,q;
    long long f_pow(long long y,long long z,long long p)
    {
        long long ans=1,base=y;
        while (z)
        {
            if (z&1) ans=(ans*base)%p;
            base=(base*base)%p;
            z>>=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(long long y,long long z,long long p)
    {
        mp.clear();
        if (z==1) return 0;
        long long m=(long long)(sqrt(1.0*p)+1);long long base=z;
        for (long long i=0;i<m;i++)
        {
            mp[base]=i;
            base=(base*y)%p;
        }
        base=f_pow(y,m,p);long long now=base;
        for (long long i=1;i<=m+1;i++)
        {
            if (mp.count(now)) return i*m-mp[now];    
            now=(now*base)%p;
        }
        return -1;
    }
    void work1()
    {
        for (long long i=1;i<=t;i++)
        {
            scanf("%lld%lld%lld",&y,&z,&p);y%=p;
            printf("%lld
    ",f_pow(y,z,p));
        }
    }
    void work2()
    {
        for (long long i=1;i<=t;i++)
        {
            scanf("%lld%lld%lld",&y,&z,&p);y%=p;z%=p;
            long long d=exgcd(y,p,x,q);
            if (z%d) printf("Orz, I cannot find x!
    ");
            else
            {
                x*=(z/d);x%=p; 
                while (x<0)
                    x+=p;
                printf("%lld
    ",x);    
            }
        }
    }
    void work3()
    {
        for (long long i=1;i<=t;i++)
        {
            scanf("%lld%lld%lld",&y,&z,&p);
            y%=p;z%=p;
            if (!y)
            {
                if (!z) printf("1
    ");
                else printf("Orz, I cannot find x!
    ");
                continue;
            }
            long long d=BSGS(y,z,p);
            if (d==-1) printf("Orz, I cannot find x!
    ");
            else printf("%lld
    ",d%p);
        }
    }
    int main()
    {
        scanf("%lld%lld",&t,&k);
        if (k==1) work1();
        else if (k==2) work2();
        else work3();
        return 0;
    }
  • 相关阅读:
    servlet 将输入内容通过拼接页面的方式显示出来
    localstorage和vue结合使用
    vue的通讯与传递props emit (简单的弹框组件)
    jquery插件之选项卡
    详解Cookie纪要
    jsonp
    滚动条样式
    axios基本使用
    IOS安卓常见问题
    简单购物车
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5950269.html
Copyright © 2011-2022 走看看