• [bzoj2242][SDOI2011]计算器


    题目大意:三合一,给你$y,z,p$,求$x$,三种询问

    1. $y^zmod{p}$
    2. $xyequiv zpmod p$的最小非负整数
    3. $y^zequiv zpmod p$的最小非负整数

    题解:求快速幂,逆元和$BSGS(离散对数)$

    $BSGS$就是用分块的思想,令$m=lceil sqrt p ceil$,因为$y^{i imes m+j}=y^{i imes m} imes y^j$所以可以预处理$y^i$(用$hash$或$map(加复杂度和大常数,但是方便。。。)$ $(unordered\_map是C++11的,考前还是不要用了吧)$,然后枚举$i$,求出$y^{i imes m}$,找一下有没有对应的$y^j$就行了

    卡点:



    C++ Code:

    #include <cstdio>
    #include <cmath>
    #include <map>
    long long T, k;
    long long y, z, p;
    namespace calc1 {
    	long long calc (long long base, long long p, long long mod) {
    		base %= mod, p %= mod - 1;
    		long long ans = 1;
    		for (; p; p >>= 1, base = base * base % mod) if (p & 1) ans = ans * base % mod;
    		return ans;
    	}
    	long long inv(long long a, long long mod) {
    		return calc(a, mod - 2, mod);
    	}
    }
    namespace calc2 {
    	long long calc (long long y, long long z, long long mod) {
    		y %= mod, z %= mod;
    		if (!y) return z ? -1 : 0;
    		long long tmp = calc1::inv(y, mod);
    		return tmp * z % mod;
    	}
    }
    namespace calc3 {
    	std::map<int, int> mp;
    	long long calc(long long y, long long z, long long mod) {
    		y %= mod, z %= mod;
    		if (!y) return -1;
    		long long tmp = 1, t = sqrt(mod - 1) + 1; 
    		mp.clear();
    		for (int i = 0; i <= t; i++) {
    			mp[tmp * z % mod] = i;
    			if (i != t) tmp = tmp * y % mod;
    		}
    		long long tmp6 = tmp;
    		for (int i = 1; i <= t; i++) {
    			if (mp.count(tmp6)) return i * t - mp[tmp6];
    			tmp6 = tmp6 * tmp % mod;
    		}
    		return -1;
    	}
    }
    int main() {
    	scanf("%lld%lld", &T, &k);
    	while (T --> 0) {
    		scanf("%lld%lld%lld", &y, &z, &p);
    		long long tmp;
    		switch (k) {
    			case 1: tmp = calc1::calc(y, z, p); break;
    			case 2: tmp = calc2::calc(y, z, p); break;
    			case 3: tmp = calc3::calc(y, z, p); break;
    		}
    		if (tmp == -1) puts("Orz, I cannot find x!");
    		else printf("%lld
    ", tmp);
    	}
    }
    
  • 相关阅读:
    docker常用命令
    2020/10/10,饮食男女-对教条主义的补充和现实的摸索
    2020/08/24,约束力
    2020/08/21,迷茫的时候就去工作
    2020/08/21,神秘和平易近人
    2020/08/21,圣人和教条
    2020/07/21,翡翠梦境
    2020/10/10,生活不是阶段式跳跃的,是螺旋式的。
    2020/07/23,再论point,way,moment,time
    2020/07/13,旅游的意义是什么
  • 原文地址:https://www.cnblogs.com/Memory-of-winter/p/9571523.html
Copyright © 2020-2023  润新知