zoukankan      html  css  js  c++  java
  • 【BZOJ】2242: [SDOI2011]计算器

    http://www.lydsy.com/JudgeOnline/problem.php?id=2242

    题意:(前两个问略...)第三个问是,求$a^x equiv b pmod{p}$最小的$x$,或者输出无解,它们范围都是$10^9$哒= =

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    int mpow(ll a, ll b, ll p) {
    	ll r=1; a%=p;
    	while(b) { if(b&1) r=((ll)r*a)%p; a=((ll)a*a)%p; b>>=1; }
    	return r;
    }
    void gcd(ll a, ll b, ll &d, ll &x, ll &y) {
    	if(!b) { d=a; x=1; y=0; return; }
    	gcd(b, a%b, d, y, x); y-=a/b*x;
    }
    void ni(ll a, ll b, ll p) {
    	ll d, x, y, t;
    	gcd(a, p, d, x, y); if(b%d) { puts("Orz, I cannot find x!"); return; }
    	t=p/d;
    	while(x<0) x+=t;
    	while(x>=t) x-=t;
    	printf("%lld
    ", (x*b)%p);
    }
    map<int, int> s;
    void bsgs(ll y, ll z, ll p) {
    	y%=p; z%=p;
    	if(z==1) { puts("0"); return; }
    	if(!y && !z) { puts("1"); return; }
    	if(!y) { puts("Orz, I cannot find x!"); return; }
    	s.clear();
    	int m=sqrt(p+0.5), t=1, w=y;
    	for(int i=0; i<m; ++i) s[((ll)z*t)%p]=i, t=((ll)t*w)%p;
    	w=mpow(y, m, p); y=1; t=(p-1)/m+1; bool flag=1;
    	for(int i=0; i<=t; ++i) if(s.count(y)) { printf("%lld
    ", (ll)m*i-s[y]); flag=0; break; } else y=((ll)y*w)%p;
    	if(flag) puts("Orz, I cannot find x!");
    }
    int main() {
    	int z, y, p, c, T;
    	scanf("%d%d", &T, &c);
    	while(T--) {
    		scanf("%d%d%d", &y, &z, &p);
    		if(c==1) printf("%d
    ", mpow(y, z, p));
    		else if(c==2) ni(y, z, p);
    		else bsgs(y, z, p);
    	}
    	return 0;
    }
    

      


    bsgs裸题....其实就是一种分块思想..(为啥有那么牛的名字呢= =其实是我不想加分类了= =)即小块暴力然后大块就解决的思想,相信你们都能秒懂= =

    要求

    $$a^x equiv b pmod{p}$$

    的最小的$x$,那么

    首先我们随便选一个$m$,使得$x=km-t, 0<=t<m$,(这虽然有点区别于取余,但是这是为了方便= =)

    然后推得

    $$a^{km} equiv ba^t pmod{p}$$

    然后就是右边暴力预处理,左边枚举$k$...由于枚举$k$复杂度是$O(n/m)$,显然取$m=sqrt{n}$最优= =...由于懒,开个set记录右边= =于是总复杂度是$O(sqrt{n}log(sqrt{n}))$

    哦最后忘记一件事= =要特判啊= =比如说$b=1$显然$x=0$啊,而且取模了$a, b$后注意特判$a=0$的情况啊= =关于一些情况没特判的同学= =我要hack你们...比如数据

    1 3
    4 1 2

  • 相关阅读:
    jQuery$命名冲突问题解决方法
    微信小程序开发工具 ubuntu linux版本
    阿里云Https通配符证书购买
    vs2017安装
    规范与标准
    Jvm远程监控
    Bash笔记
    Html5前端笔记
    Php7 开发笔记
    webpack笔记
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4293360.html
Copyright © 2011-2022 走看看