zoukankan      html  css  js  c++  java
  • BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

    2242: [SDOI2011]计算器

    题意:求(a^b mod p, ax equiv b mod p, a^x equiv b mod p),p是质数


    这种裸题我竟然WA了好多次

    第三个注意判断a和b整除p的情况

    #pragma GCC optimize ("O2")
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <map>
    using namespace std;
    typedef long long ll;
    #define fir first
    #define sec second
    inline int read() {
    	char c=getchar(); int x=0, f=1;
    	while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
    	while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
    	return x*f;
    }
    
    int a, b, p;
    ll Pow(ll a, int b, int p) {
    	a%=p; ll ans=1;
    	for(; b; b>>=1, a=a*a%p)
    		if(b&1) ans=ans*a%p;
    	return ans;
    }
    ll inv(int a, int p) {
    	if(a%p==0) return -1;
    	return Pow(a, p-2, p);
    }
    map<int, int> ma;
    ll ind(int a, int b, int p) {
    	a%=p; b%=p;
    	ma.clear();
    	ll e=1; int m=sqrt(p)+0.5;
    	for(int i=0; i<m; i++) {
    		if(!ma.count(e)) ma[e]=i;
    		e=e*a%p;
    	}
    	e=Pow(e, p-2, p);
    	for(int i=0; i<m; i++) {
    		if(ma.count(b)) return i*m + ma[b];
    		b=b*e%p;
    	}
    	return -1;
    }
    int main() {
    	//freopen("in","r",stdin);
    	freopen("calc.in","r",stdin);
    	freopen("calc.out","w",stdout);
    	int T=read(), type=read();
    	while(T--) {
    		a=read(); b=read(); p=read();
    		ll ans;
    		if(type==1) ans=Pow(a, b, p);
    		else if(type==2) {ans=inv(a, p);if(ans!=-1) ans=ans*b%p;}
    		else ans=ind(a, b, p);
    		if(ans==-1) puts("Orz, I cannot find x!");
    		else printf("%lld
    ", ans);
    	}
    }
    
  • 相关阅读:
    Windwos堆管理体系以及溢出利用
    Python利用ctypes实现C库函数调用
    Windows异常分发
    初探Windows用户态调试机制
    HTTP协议
    《格蠹汇编》调试笔记
    IDT系统中断描述表以及绕过Xurtr检测的HOOK姿势
    C++ 各种构造函数
    PsSetCreateProcessNotifyRoutineEx 创建回调函数
    导出函数与未导出函数
  • 原文地址:https://www.cnblogs.com/candy99/p/6652771.html
Copyright © 2011-2022 走看看