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 = , y = ;
  16. }
  17. const LL MOD = ;
  18. const int N = ;
  19.  
  20. LL multi(LL a, LL p) {
  21. LL ret = ;
  22. a %= MOD;
  23. while (p > ) {
  24. if (p & ) ret *= a, ret %= MOD;
  25. a *= a, a %= MOD, p >>= ;
  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 = ; 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)) + ;
  49. bs(b, x, rt);
  50. LL st = multi(x, rt), p, q, d;
  51. cur = ;
  52. for (int i = ; 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 + ;
  56. cur *= st, cur %= MOD;
  57. }
  58. return -;
  59. }
  60.  
  61. LL bf(LL b, LL x, LL r) {
  62. LL cur = b;
  63. for (int i = ; i < MOD; i++) {
  64. if (cur == r) return mincol + i + ;
  65. cur *= x, cur %= MOD;
  66. }
  67. return -;
  68. }
  69. int main() {
  70. //freopen("in", "r", stdin);
  71. LL n, k, b, r, x, y, bres;
  72. int T, cas = ;
  73. cin >> T;
  74. while (T-- && cin >> n >> k >> b >> r) {
  75. for (int i = ; i < N; i++) rec[i].clear();
  76. id.clear();
  77. mincol = ;
  78. for (int i = ; i < b; i++) {
  79. cin >> x >> y;
  80. if (id.find(y) == id.end()) id[y] = id.size() - ;
  81. rec[id[y]].push_back(x);
  82. mincol = max(mincol, x);
  83. }
  84. bres = ;
  85. for (int i = , sz = id.size(); i < sz; i++) {
  86. rec[i].push_back();
  87. rec[i].push_back(mincol + );
  88. sort(rec[i].begin(), rec[i].end());
  89. for (int j = , szj = rec[i].size(); j < szj; j++) {
  90. if (rec[i][j] - rec[i][j - ] - >= ) bres *= k * multi(k - , (LL) rec[i][j] - rec[i][j - ] - ) % MOD, bres %= MOD;
  91. }
  92. }
  93. LL tmp = k * multi(k - , mincol - );
  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 = ;
  99. for (int i = , sz = id.size(); i < sz; i++) {
  100. rec[i].pop_back();
  101. if (rec[i][rec[i].size() - ] == mincol) bres *= k, bres %= MOD, cnt++;
  102. }
  103. bres *= multi(k - , n - cnt);
  104. bres %= MOD;
  105. k = multi(k - , n);
  106. cout << gs(bres, k, r) << endl;
  107. //cout << bf(bres, k, r) << endl;
  108. }
  109. return ;
  110. }

——written by Lyon

uva 11916 Emoogle Grid (BSGS)的更多相关文章

  1. UVA 11916 Emoogle Grid(同余模)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. uva11916 Emoogle Grid (BSGS)

    https://uva.onlinejudge.org/external/119/p11916.pdf 令m表示不能染色的格子的最大行号 设>m行时可以染k种颜色的格子数有ck个,恰好有m行时可 ...

  3. uva 11916 Emoogle Grid

    题意:用K种颜色给一个N*M的格子涂色.其中有B个格子是不能涂色的.涂色时满足同一列上下紧邻的两个格子的颜色不同.所有的涂色方案模100000007后为R.现在给出M.K.B.R,求一个最小的N,满足 ...

  4. UVA - 11916 Emoogle Grid (组合计数+离散对数)

    假如有这样一道题目:要给一个M行N列的网格涂上K种颜色,其中有B个格子不用涂色,其他每个格子涂一种颜色,同一列中的上下两个相邻格子不能涂相同颜色.给出M,N,K和B个格子的位置,求出涂色方案总数除以1 ...

  5. UVA 11916 Emoogle Grid 离散对数 大步小步算法

    LRJ白书上的题 #include <stdio.h> #include <iostream> #include <vector> #include <mat ...

  6. CJOJ 1071 【Uva】硬币问题(动态规划)

    CJOJ 1071 [Uva]硬币问题(动态规划) Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为 ...

  7. 【BZOJ5296】【CQOI2018】破解D-H协议(BSGS)

    [BZOJ5296][CQOI2018]破解D-H协议(BSGS) 题面 BZOJ 洛谷 Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方 ...

  8. SilverLight:布局(1) Border(边框)对象、Grid(网格)对象

    ylbtech-SilverLight-Layout:布局(1) Border(边框)对象.Grid(网格)对象 A, Border(边框)对象 B, Grid(网格)对象 C, Grid(网格)对象 ...

  9. 【洛谷九月月赛T1】签到题(bsgs)(快速乘)

    说好的签到题呢qwq....怎么我签到题都不会啊qwq 之后看了bsgs才发现貌似不是那么那么难fake!!什么东西... 先贴上部分分做法(也就是枚举1的个数,然后每一步都进行取模(这和最后取模结果 ...

随机推荐

  1. 第十章—DOM(三)——Text类型

    文本节点由TEXT类型表示,包含纯文本内容,Text节点具有以下特征: 看看下面的代码: div元素开始和结束标签只要存在内容,就会创建一个文本节点.可以使用以下代码来访问元素的这些文本子节点: 访问 ...

  2. Java连接Neo4j的两种方式

    1.Neo4j数据库的两种方式 Neo4j可以以两种方式运行: Java应用程序中的嵌入式数据库 通过REST的独立服务器 不管哪一种方式,这个选择不会影响查询和使用数据库的方式. 它是由应用程序的性 ...

  3. 一款优秀的前端JS框架—AngularJS

      前  言 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML,且通过 表 ...

  4. POJ 1845 (洛谷 :题目待添加)Sumdiv

    约数和 题目描述 给出a和b求a^b的约数和. 输入格式: 一行两个数a,b. 输出格式: 一个数表示结果对 9901 的模. Input 2 3 Output 15 SB的思路: 这是一道典型的数论 ...

  5. cmake时选择的VS生成器

    运行cmake --help 在得到的输出中可以得到下面的结果:

  6. 微服务开源生态报告 No.6

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  7. JavaScript--函数对象的属性caller与callee

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【JZOJ2758】【SDOI2012】走迷宫(labyrinth)

    ╰( ̄▽ ̄)╭ Morenan 被困在了一个迷宫里. 迷宫可以视为 N 个点 M 条边的有向图,其中 Morena n处于起点 S , 迷宫的终点设为 T . 可惜的是 , Morenan 非常的脑小 ...

  9. 【JZOJ4813】【NOIP2016提高A组五校联考2】running

    题目描述 小胡同学是个热爱运动的好孩子. 每天晚上,小胡都会去操场上跑步,学校的操场可以看成一个由n 个格子排成的一个环形,格子按照顺时针顺序从0 到n-1 标号. 小胡观察到有m 个同学在跑步,最开 ...

  10. Apache Camel 与 Spring Boot 集成,通过FTP定时采集、处理文件 (转)

    1.概要: 本项目主要是通过在Spring平台上配置Camel.FTP,实现定时从FTP服务器下载文件到本地.解析文件.存入数据库等功能. 2.搭建空项目: Spring Boot有几种自动生成空项目 ...