Uva_11916 Emoogle Grid
题意:
有个N X M的棋盘, 有K种颜色, 有B个不可涂色的位置, 共有R种涂色方案。
1)每个可涂色的位置必须涂上一种颜色
2)不可涂色位置不能涂色
3)每个位置必须从K种颜色中选出一种颜色进行涂色
4)当前格子(x,y) 上面的那个格子(x+1,y)不能同色
现在已知N, K, B, R, 求满足条件的最小的M
思路:
B个不可涂色位置设为(x1, y1), (x2, y2), (x3, y3), ... , (xb, yb)
1)M必然 ≥ max(x[i])
2)设前max(x[i]) 行 与 max(x[i]) + 1 行涂色方案为 cnt, 则 max(x[i]) + 1之后的每一行, 涂色方案都是 (K-1)^N。
3)设P = (K - 1) ^ N
存在一个j 使得:
cnt * P^j = R
右乘cnt的逆元 cnt ^ -1 得:
P^j = R * cnt ^ -1
即求一个最小的j满足上式。
P^j ≡ R * cnt ^ -1 (mod MOD) , MOD = 100000007
利用对数取余进行求解
代码如下:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
using namespace std;
#define LL long long
#define MAXN 550
#define MOD 100000007
int n, b, r, k, m;
int x[MAXN], y[MAXN];
set<pair<int, int> > best; void ex_gcd(LL a, LL b, LL& d, LL& x, LL& y)
{
if(!b) {d = a; x = ; y = ;}
else
{ex_gcd(b, a%b, d, y, x); y -= x*(a/b);}
} LL inv(LL a)
{
LL d, x, y;
ex_gcd(a, MOD, d, x, y);
return d == ?(x + MOD) % MOD : -;
} LL mul_mod(LL a, LL b)
{
return a * b % MOD;
} LL pow_mod(LL a, LL p)
{
if(p == ) return ;
LL ans = pow_mod(a, p/);
ans = ans * ans % MOD;
if(p % == ) ans = ans * a % MOD;
return ans;
} int log_mod(int a, int b)
{
int m, v, e = , i;
m = (int)sqrt(MOD+0.5);
v = inv(pow_mod(a, m));
map<int, int> x;
x[] = ;
for (int i = ; i < m; i++)
{
e = mul_mod(e, a);
if (!x.count(e))
x[e] = i;
}
for (int i = ; i < m; i++)
{
if (x.count(b))
return i*m + x[b];
b = mul_mod(b, v);
}
return -;
} int solve()
{
int cur = ;
int cnt = ; for(int i = ; i < b; i ++)
if(x[i] != m && !best.count(make_pair(x[i] + , y[i]))) cur ++;
cur += n;
for(int i = ; i < b; i ++)
if(x[i] == ) cur --; // ans = k^cur * (k-1) ^ (n*m - b - cur);
cnt = mul_mod(pow_mod(k, cur), pow_mod(k - , (LL)n * m - b - cur)); if(cnt == r) return m; cur = ;
for(int i = ; i < b; i ++)
if(x[i] == m) cur ++; //ans = cnt * k^cur * (k - 1)^(n - cur);
cnt = mul_mod(cnt, pow_mod(k, cur));
cnt = mul_mod(cnt, pow_mod(k - , n - cur));
m ++; if(cnt == r) return m; //printf("%d %d %d\n", pow_mod(k - 1, n), inv(cnt), log_mod(pow_mod(k - 1, n), mul_mod(r, inv(cnt))));
// P = (k - 1) ^ n, P^x = r * cnt^-1;
return log_mod(pow_mod(k - , n), mul_mod(r, inv(cnt))) + m;
} int main()
{
int T;
scanf("%d", &T);
for(int kcase = ; kcase <= T; kcase ++)
{
scanf("%d %d %d %d", &n, &k, &b, &r);
best.clear();
m = ;
for(int i = ; i < b; i ++)
{
scanf("%d %d",&x[i], & y[i]);
m = max(m, x[i]);
best.insert(make_pair(x[i], y[i]));
}
printf("Case %d: %d\n", kcase, solve());
}
return ;
}
这题WA了一天, 反复找错都没找到, 重写第N + 1次的时候终于找到错误 , 求逆函数写错了 囧
Uva_11916 Emoogle Grid的更多相关文章
- [uva11916] Emoogle Grid (离散对数)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Emoogle Grid You have to color an MxN ( ...
- UVA11916 Emoogle Grid
Emoogle Grid You have to color an M × N (1 ≤ M, N ≤ 108 ) two dimensional grid. You will be provided ...
- UVA 11916 Emoogle Grid(同余模)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 11916 (离散对数) Emoogle Grid
因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色. 如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择. 反过来,如果一个格子位于第一列,或者上面相邻的格子 ...
- uva 11916 Emoogle Grid
题意:用K种颜色给一个N*M的格子涂色.其中有B个格子是不能涂色的.涂色时满足同一列上下紧邻的两个格子的颜色不同.所有的涂色方案模100000007后为R.现在给出M.K.B.R,求一个最小的N,满足 ...
- UVA 11916 Emoogle Grid 离散对数 大步小步算法
LRJ白书上的题 #include <stdio.h> #include <iostream> #include <vector> #include <mat ...
- uva11916 Emoogle Grid (BSGS)
https://uva.onlinejudge.org/external/119/p11916.pdf 令m表示不能染色的格子的最大行号 设>m行时可以染k种颜色的格子数有ck个,恰好有m行时可 ...
- UVA - 11916 Emoogle Grid (组合计数+离散对数)
假如有这样一道题目:要给一个M行N列的网格涂上K种颜色,其中有B个格子不用涂色,其他每个格子涂一种颜色,同一列中的上下两个相邻格子不能涂相同颜色.给出M,N,K和B个格子的位置,求出涂色方案总数除以1 ...
- uva 11916 Emoogle Grid (BSGS)
UVA 11916 BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了. 代码如下: #include <cstdio> #i ...
随机推荐
- [Oracle] - 性能优化工具(5) - AWRSQL
在AWR中定位到问题SQL语句后想要了解该SQL statement的详细运行计划,于是就用AWR报告中得到的SQL ID去V$SQL等几个动态性能视图中查询,但发现V$SQL或V$SQL_PLAN视 ...
- cocos2d-x学习日志(13) --A星寻路算法demo
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...
- qt 与mysql建立交互式连接
void QSqlDatabase::setConnectOptions(const QString & options = QString())Sets database-specific ...
- 阿里云SQL Server 2008 客户端导入数据库教程
一.适用场景 源端数据库是SQL Server 2005 及以上.(SQL Server 2000未测试.) 数据文件总大小在10G以内. 可以在低峰期停应用. 二.导出步骤 1.软件准备 ...
- Notification与多线程
来源:南峰子(@南峰子_老驴 ) 链接:http://t.cn/R5swQcR 前几天与同事讨论到Notification在多线程下的转发问题,所以就此整理一下. 先来看看官方的文档,是这样写的: I ...
- 软件版本中的Alpha,Beta,RC,Trial是什么意思?
版本号: V(Version):即版本,通常用数字表示版本号.(如:EVEREST Ultimate v4.20.1188 Beta ) Build:用数字或日期标示版本号的一种方式.(如:VeryC ...
- GitHub详细教程
GitHub详细教程 Table of Contents 1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 ...
- HDU 5637 Transform
题意: 有两种变换: 1. 改变此数二进制的某一位(1变成0 或者 0变成1) 2. 让它与给出的n个数当中的任意一个做异或运算 给你两个数s, t,求从s到t最少要经过几步变换,一共m组查询思路: ...
- MYSQL 基础操作
1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样 ...
- enableEventValidation
回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEve ...