bzoj3239 Discrete Logging

5 篇文章 0 订阅

Description


Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 2 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer L such that

BL == N (mod P)

for each line print the logarithm on a separate line. If there are several, print the smallest; if there is none, print “no solution”.

Solution


原来这玩意叫离散对数啊
ABC(modP) A B ≡ C ( mod P ) 这样的东西直接上BSGS

Code


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)

typedef long long LL;

std:: map <int, int> map;

LL ksm(LL x,LL dep,LL p) {
    if (dep==0) return 1;
    if (dep==1) return x%p;
    LL tmp=ksm(x,dep/2,p);
    if (dep&1) return tmp*tmp%p*x%p;
    return tmp*tmp%p;
}

void BSGS(LL b,LL n,LL p) {
    map.clear();
    int t=(int)ceil(sqrt(p));
    rep(i,0,t) {
        LL tmp=ksm(b,i,p)*n%p;
        map[tmp]=i;
    }
    rep(i,1,t) {
        LL tmp=ksm(b,t*i,p);
        if (map.count(tmp)) {
            LL ans=t*i-map[tmp];
            while (ans<0) ans+=p;
            printf("%lld\n", ans);
            return ;
        }
    }
    puts("no solution");
}

int main(void) {
    LL b,n,p;
    while (~scanf("%lld%lld%lld",&p,&b,&n)) {
        BSGS(b,n,p);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值