zoukankan      html  css  js  c++  java
  • uva 11916 Emoogle Grid (BSGS)

    UVA 11916

      BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了。

    代码如下:

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <algorithm>
      4 #include <cstring>
      5 #include <vector>
      6 #include <cmath>
      7 #include <map>
      8 
      9 using namespace std;
     10 
     11 template<class T> T gcd(T a, T b) { return b ? a : gcd(b, a % b);}
     12 typedef long long LL;
     13 void gcd(LL a, LL b, LL &d, LL &x, LL &y) {
     14     if (b) { gcd(b, a % b, d, y, x); y -= a / b * x;}
     15     else d = a, x = 1, y = 0;
     16 }
     17 const LL MOD = 100000007;
     18 const int N = 555;
     19 
     20 LL multi(LL a, LL p) {
     21     LL ret = 1;
     22     a %= MOD;
     23     while (p > 0) {
     24         if (p & 1) ret *= a, ret %= MOD;
     25         a *= a, a %= MOD, p >>= 1;
     26     }
     27     return ret;
     28 }
     29 map<LL, int> id;
     30 vector<LL> rec[N];
     31 LL mincol;
     32 
     33 void bs(LL b, LL x, LL rt) {
     34     id.clear();
     35     for (int i = 0; i <= rt; i++) {
     36         if (id.find(b) != id.end()) break;
     37         id[b] = i;
     38         b *= x, b %= MOD;
     39     }
     40 }
     41 
     42 LL gs(LL b, LL x, LL r) {
     43     LL cur = b;
     44     //for (int i = 0; i < 50; i++) {
     45         //if (cur == r) return mincol + i + 1;
     46         //cur *= x, cur %= MOD;
     47     //}
     48     int rt = (int) ceil(sqrt((double) MOD)) + 1;
     49     bs(b, x, rt);
     50     LL st = multi(x, rt), p, q, d;
     51     cur = 1;
     52     for (int i = 0; i <= rt; i++) {
     53         gcd(cur, MOD, d, p, q);
     54         p %= MOD, p += MOD, p %= MOD, p *= r / d, p %= MOD;
     55         if (id.find(p) != id.end()) return (LL) i * rt + id[p] + mincol + 1;
     56         cur *= st, cur %= MOD;
     57     }
     58     return -1;
     59 }
     60 
     61 LL bf(LL b, LL x, LL r) {
     62     LL cur = b;
     63     for (int i = 0; i < MOD; i++) {
     64         if (cur == r) return mincol + i + 1;
     65         cur *= x, cur %= MOD;
     66     }
     67     return -1;
     68 }
     69 int main() {
     70     //freopen("in", "r", stdin);
     71     LL n, k, b, r, x, y, bres;
     72     int T, cas = 1;
     73     cin >> T;
     74     while (T-- && cin >> n >> k >> b >> r) {
     75         for (int i = 0; i < N; i++) rec[i].clear();
     76         id.clear();
     77         mincol = 1;
     78         for (int i = 0; i < b; i++) {
     79             cin >> x >> y;
     80             if (id.find(y) == id.end()) id[y] = id.size() - 1;
     81             rec[id[y]].push_back(x);
     82             mincol = max(mincol, x);
     83         }
     84         bres = 1;
     85         for (int i = 0, sz = id.size(); i < sz; i++) {
     86             rec[i].push_back(0);
     87             rec[i].push_back(mincol + 1);
     88             sort(rec[i].begin(), rec[i].end());
     89             for (int j = 1, szj = rec[i].size(); j < szj; j++) {
     90                 if (rec[i][j] - rec[i][j - 1] - 2 >= 0) bres *= k * multi(k - 1, (LL) rec[i][j] - rec[i][j - 1] - 2) % MOD, bres %= MOD;
     91             }
     92         }
     93         LL tmp = k * multi(k - 1, mincol - 1);
     94         bres *= multi(tmp, n - id.size());
     95         bres %= MOD;
     96         cout << "Case " << cas++ << ": ";
     97         if (bres == r) { cout << mincol << endl; continue; }
     98         int cnt = 0;
     99         for (int i = 0, sz = id.size(); i < sz; i++) {
    100             rec[i].pop_back();
    101             if (rec[i][rec[i].size() - 1] == mincol) bres *= k, bres %= MOD, cnt++;
    102         }
    103         bres *= multi(k - 1, n - cnt);
    104         bres %= MOD;
    105         k = multi(k - 1, n);
    106         cout << gs(bres, k, r) << endl;
    107         //cout << bf(bres, k, r) << endl;
    108     }
    109     return 0;
    110 }
    View Code

    ——written by Lyon

  • 相关阅读:
    springboot整合Quartz框架
    安装 和 配置 HBase
    HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
    HBase基本知识和应用场景
    修改idea的临时数据存放目录(默认保存在C盘用户目录下的.IntelliJIdea2020.3)
    Eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法(关于快捷键失效原因可能是与输入法的快捷键冲突)
    参考大数据厦门大学林子雨编著的《大数据技术原理与应用(第3版)》中第三课《HDFS编程实践(Hadoop3.1.3)》遇到的bug
    框架设计思维符合语义即可使用,而不用关心底层的实现
    Ubuntu下无法输入中文问题解决
    HDFS编程实践(Hadoop3.1.3)
  • 原文地址:https://www.cnblogs.com/LyonLys/p/uva_11916_Lyon.html
Copyright © 2011-2022 走看看