Skip to main content
  1. Posts/

hdu 2815 Mod Tree (扩展BSGS算法)

·1 min
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

题意:k^D=n(%p),求最小的D  (1<=K, P, N<=10^9)

思路:出题人英文水平捉鸡。。。。

扩展BSGS算法即可,注意p>=n的时候显然是无解的,判掉。

  1/* ***********************************************
  2Author :111qqz
  3Created Time :Mon 24 Jul 2017 09:43:41 PM CST
  4File Name :2815.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <set>
 14#include <map>
 15#include <string>
 16#include <cmath>
 17#include <cstdlib>
 18#include <ctime>
 19#define PB push_back
 20#define fst first
 21#define sec second
 22#define lson l,m,rt<<1
 23#define rson m+1,r,rt<<1|1
 24#define ms(a,x) memset(a,x,sizeof(a))
 25typedef long long LL;
 26#define pi pair < int ,int >
 27#define MP make_pair
 28
 29using namespace std;
 30const double eps = 1E-8;
 31const int dx4[4]={1,0,0,-1};
 32const int dy4[4]={0,-1,1,0};
 33const int inf = 0x3f3f3f3f;
 34LL k,p,n;
 35map<LL,LL>mp;
 36LL ksm(LL a,LL b,LL p)
 37{
 38    LL res = 1LL;
 39    while (b)
 40    {
 41        if (b&1) res = res * a % p;
 42        b = b>>1LL;
 43        a = a * a % p;
 44    }
 45    return res;
 46}
 47LL gcd( LL a,LL b){return b?gcd(b,a%b):a;}
 48LL BSGS(LL a,LL b,LL p)
 49{
 50    a%=p;
 51    b%=p;
 52   // if (a==0&&b==0) return 0;
 53   // if (a==0) return -1;
 54    if (b==1) return 0;
 55    int cnt = 0 ;
 56    LL t = 1;
 57    for (int g = gcd(a,p); g!=1 ; g = gcd(a,p))
 58    {
 59        if (b%g) return -1;
 60        p/=g;
 61        b/=g;
 62        t=t*a/g%p;
 63        cnt++;
 64        if (b==t) return cnt;
 65    }
 66    mp.clear();
 67    int m = ceil(sqrt(double(p)));
 68    LL base = b ;
 69    for ( LL i = 0 ; i < m ; i++)
 70    {
 71        mp[base] =  i;
 72        base = base * a % p;
 73    }
 74    base = ksm(a,m,p);
 75    LL ret = t ;
 76    for ( int i = 1 ; i <= m+1 ; i++)
 77    {
 78        ret = ret * base % p;
 79        if (mp.count(ret)) return i*m-mp[ret]+cnt;
 80    }
 81    return -1;
 82}
 83int main()
 84{
 85    #ifndef  ONLINE_JUDGE
 86    freopen("./in.txt","r",stdin);
 87  #endif
 88    while (~scanf("%lld%lld%lld",&k,&p,&n))
 89    {
 90	if (n>=p)
 91	{
 92	    puts("Orz,I can’t find D!");
 93	    continue;
 94	}
 95        if (p==1)
 96	{
 97	    puts("Orz,I can’t find D!");
 98	    continue;
 99        }
100         LL ans = BSGS(k,n,p);
101             if (ans==-1) puts("Orz,I can’t find D!");
102             else printf("%lld\n",ans);
103    }
104
105  #ifndef ONLINE_JUDGE
106  fclose(stdin);
107  #endif
108    return 0;
109}

Related

poj 2417 Discrete Logging (BSGS算法)

·2 mins
题目链接 题意: Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, base B, modulo P. That is, find an integer L such that BL == N (mod P)

codeforces #413 C. Fountains (BIT维护前缀max)

·2 mins
题目链接 题意:有2种货币,分别为C和D.给出n种资源的代价和美丽度,每种资源只能用其中一种资源购买。现在拥有货币C的数量是c,拥有货币D的数量是d.然后恰好买2个资源,问最大美丽度,不能的话输出0.

codeforces #413 B T-shirt buying (贪心)

·2 mins
题目链接 题意:有n个T恤,每个价格都不同,有三种颜色,分别用1,2,3表示,每件T恤给出前xiong和后背的颜色。现在有m个顾客排成一队,对于每个顾客,给出他喜欢的颜色,只要一个T恤的前xiong或者后背的颜色之一满足该颜色即可。顾客总希望买符合他喜欢颜色的T恤中价格最低的。现在问每个顾客买到的T恤的价格,如果某个顾客没有买T恤,输出-1