UVA 11916

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

代码如下:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map> using namespace std; template<class T> T gcd(T a, T b) { return b ? a : gcd(b, a % b);}
typedef long long LL;
void gcd(LL a, LL b, LL &d, LL &x, LL &y) {
if (b) { gcd(b, a % b, d, y, x); y -= a / b * x;}
else d = a, x = , y = ;
}
const LL MOD = ;
const int N = ; LL multi(LL a, LL p) {
LL ret = ;
a %= MOD;
while (p > ) {
if (p & ) ret *= a, ret %= MOD;
a *= a, a %= MOD, p >>= ;
}
return ret;
}
map<LL, int> id;
vector<LL> rec[N];
LL mincol; void bs(LL b, LL x, LL rt) {
id.clear();
for (int i = ; i <= rt; i++) {
if (id.find(b) != id.end()) break;
id[b] = i;
b *= x, b %= MOD;
}
} LL gs(LL b, LL x, LL r) {
LL cur = b;
//for (int i = 0; i < 50; i++) {
//if (cur == r) return mincol + i + 1;
//cur *= x, cur %= MOD;
//}
int rt = (int) ceil(sqrt((double) MOD)) + ;
bs(b, x, rt);
LL st = multi(x, rt), p, q, d;
cur = ;
for (int i = ; i <= rt; i++) {
gcd(cur, MOD, d, p, q);
p %= MOD, p += MOD, p %= MOD, p *= r / d, p %= MOD;
if (id.find(p) != id.end()) return (LL) i * rt + id[p] + mincol + ;
cur *= st, cur %= MOD;
}
return -;
} LL bf(LL b, LL x, LL r) {
LL cur = b;
for (int i = ; i < MOD; i++) {
if (cur == r) return mincol + i + ;
cur *= x, cur %= MOD;
}
return -;
}
int main() {
//freopen("in", "r", stdin);
LL n, k, b, r, x, y, bres;
int T, cas = ;
cin >> T;
while (T-- && cin >> n >> k >> b >> r) {
for (int i = ; i < N; i++) rec[i].clear();
id.clear();
mincol = ;
for (int i = ; i < b; i++) {
cin >> x >> y;
if (id.find(y) == id.end()) id[y] = id.size() - ;
rec[id[y]].push_back(x);
mincol = max(mincol, x);
}
bres = ;
for (int i = , sz = id.size(); i < sz; i++) {
rec[i].push_back();
rec[i].push_back(mincol + );
sort(rec[i].begin(), rec[i].end());
for (int j = , szj = rec[i].size(); j < szj; j++) {
if (rec[i][j] - rec[i][j - ] - >= ) bres *= k * multi(k - , (LL) rec[i][j] - rec[i][j - ] - ) % MOD, bres %= MOD;
}
}
LL tmp = k * multi(k - , mincol - );
bres *= multi(tmp, n - id.size());
bres %= MOD;
cout << "Case " << cas++ << ": ";
if (bres == r) { cout << mincol << endl; continue; }
int cnt = ;
for (int i = , sz = id.size(); i < sz; i++) {
rec[i].pop_back();
if (rec[i][rec[i].size() - ] == mincol) bres *= k, bres %= MOD, cnt++;
}
bres *= multi(k - , n - cnt);
bres %= MOD;
k = multi(k - , n);
cout << gs(bres, k, r) << endl;
//cout << bf(bres, k, r) << endl;
}
return ;
}

——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. mysql查询某个字段重复的数据

    查询某个字段重复的数据 ; 查询股票重复的营业厅 ;

  2. WIN7快捷键大全

    1. 轻松访问键盘快捷方式 按住右Sht 8秒钟: 启用和关闭筛选键 按左 Alt+左 Sht+PrtScn(或 PrtScn):启用或关闭高对比度 按左 Alt+左 Sht+Num Lock :启用 ...

  3. Vijos1212 Way Selection [2017年6月计划 二分图03]

    Way Selection 背景 小杉家族遭遇了前所未有的大危机 他想知道怎么逃生 描述 小杉家族r个人正在一片空地上散步,突然,外星人来了…… 留给小杉家族脱逃的时间只有t秒,每个小杉都有一个跑的速 ...

  4. Leetcode73. Set Matrix Zeroes矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ] 输 ...

  5. Leetcode643.Maximum Average Subarray I子数组的最大平均数1

    给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.75 解释: 最大平均数 (12- ...

  6. 有趣的HTML5 Web 存储

    HTML5 web 存储,一个比cookie更好的本地存储方式. 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是 cookie.但是Web ...

  7. MySQL常见数据库引擎及对比

    一:MySQL存储引擎简介 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB) ...

  8. 模拟21 题解(waiting)

    留坑待填 效率!!! 题还没改Oh,NO!!!

  9. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU外设那些事(2)- 善变的FlexRAM

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的FlexRAM外设. 本文是外设系列第二篇,上一篇讲的是离内核最近的高速缓存L1 Cache, ...

  10. python实现贝叶斯网络的概率推导(Probabilistic Inference)

    写在前面 这是HIT2019人工智能实验三,由于时间紧张,代码没有进行任何优化,实验算法仅供参考. 实验要求 实现贝叶斯网络的概率推导(Probabilistic Inference) 具体实验指导书 ...