• [TJOI2007] 可爱的质数


    题意

    求最小的(x)满足(a^x equiv bmod p)

    想法

    这个是标准的板子题,(BSGS)算法可以用来解决(a^x equiv bmod p)(x^a equiv bmod p)问题
    本题是前者

    我们考虑这样 (a^{A * sqrt p - B} equiv bmod p)

    (a^{A * sqrt p} equiv ba^{B}mod p)
    其中((A,B < sqrt p)
    我们先枚举(B)统计出(ba^B)的答案用(hash 或者 map)给存下来
    再枚举(A)统计答案即可

    代码(与想法里的字符不同)

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cmath>
    #define ll long long
    
    using std::map;
    
    ll a,b,p;
    ll A,B,minn = 0x3f3f3f3f;
    
    map<ll,ll>QWQ;
    
    ll ans[1000],cnt;
    
    int main(){
    	scanf("%lld%lld%lld",&p,&a,&b);//5 2 3 2 ^ x == 3 (mod 5)
    	ll s = ceil(sqrt(p));
    	if(a % p == 0){
    		puts("no solution");
    		return 0;
    	}
    	QWQ[s] = 0;
    	B = b,A = 1;
    	for(int i = 1;i <= s;++i){
    		B = (B * a) % p;
    		A = (A * a) % p;
    		QWQ[B] = i;
    	} 
    	ll now = 1;
    	for(int i = 1;i <= s;++i){
    		now = (now * A) % p;
    		if(QWQ[now]){
    			std::cout<<(i * s - QWQ[now] + 2 * p) % p<<std::endl;
    			return 0;
    		}
    	}
    	puts("no solution");
    }
    
  • 相关阅读:
    怎样才能算是在技术上活跃的小公司
    jquery幻灯片--渐变
    cpm效果介绍
    我依然热爱编程
    项目开发经验终结2015/4/7
    windows上putty访问ubuntu
    ubuntu安装openssh-server
    今天犯了一个低级错误
    linux 搭建lamp环境
    能用存储过程的DBHelper类
  • 原文地址:https://www.cnblogs.com/dixiao/p/14245921.html
Copyright © 2020-2023  润新知