uva 11916 Emoogle Grid
题意:用K种颜色给一个N*M的格子涂色。其中有B个格子是不能涂色的。涂色时满足同一列上下紧邻的两个格子的颜色不同。所有的涂色方案模100000007后为R。现在给出M、K、B、R,求一个最小的N,满足题意。
思路:分成两个部分。设给出的B个不能涂的格子的最大行坐标为m。 首先,我们能计算出前m行的方案数cnt,若cnt=r,则m就是答案。每增加一行,就会增加(K-1)^m种方法,接着令p=(K-1)^M,我们能计算出前m+1行的方案数cnt,若cnt=r 则答案为 m+1。否则,设下面还需要t行,那么有cnt*(p)^t%100000007=R,将cnt的逆元乘到右侧得到新的 p^t=R*reverse(cnt)。那么就成了求最小的t满足p^t%100000007=R*reverse(cnt)。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
using namespace std; const int MOD = ;
const int maxb = + ;
int n, m, k, b, r, x[maxb], y[maxb];
set<pair<int, int> > bset; int pow_mod(int a, long long p)
{
if(p == )
return ;
int ans = pow_mod(a, p/);
ans = (long long)ans * ans % MOD;
if(p%)
ans = (long long)ans * a % MOD;
return ans;
} int mul_mod(int a, int b)
{
return (long long)a * b % MOD;
} int inv(int a)
{
return pow_mod(a, MOD-);
} int log_mod(int a, int b)
{
int m, v, e = , i;
m = (int)sqrt(MOD);
v = inv(pow_mod(a, m));
map <int,int> x;
x[] = ;
for(i = ; i < m; i++)
{
e = mul_mod(e, a);
if (!x.count(e)) x[e] = i;
}
for(i = ; i < m; i++)
{
if(x.count(b)) return i*m + x[b];
b = mul_mod(b, v);
}
return -;
} // 计算可变部分的方案数
int count()
{
int c = ; // 有k种涂法的格子数
for(int i = ; i < b; i++)
{
if(x[i] != m && !bset.count(make_pair(x[i]+, y[i]))) c++; // 不可涂色格下面的可涂色格
}
c += n; // 第一行所有空格都有k种涂法
for(int i = ; i < b; i++)
if(x[i] == ) c--; // 扣除那些不能涂色的格子 // ans = k^c * (k-1)^(mn - b - c)
return mul_mod(pow_mod(k, c), pow_mod(k-, (long long)m*n - b - c));
} int doit()
{
int cnt = count();
if(cnt == r) return m; // 不变部分为空 int c = ;
for(int i = ; i < b; i++)
if(x[i] == m)
c++; // 可变部分第一行中有k种涂法的格子数
m++; // 多了一行(可变部分的第一行)
cnt = mul_mod(cnt, pow_mod(k, c));
cnt = mul_mod(cnt, pow_mod(k-, n - c));
if(cnt == r) return m; // 此时cnt为不变部分和可变部分第一行的方案总数 return log_mod(pow_mod(k-,n), mul_mod(r, inv(cnt))) + m;
} int main()
{
int T;
scanf("%d", &T);
for(int t = ; t <= T; t++)
{
scanf("%d%d%d%d", &n, &k, &b, &r);
bset.clear();
m = ;
for(int i = ; i < b; i++)
{
scanf("%d%d", &x[i], &y[i]);
if(x[i] > m) m = x[i]; // 更新不变部分的行数
bset.insert(make_pair(x[i], y[i]));
}
printf("Case %d: %d\n", t, doit());
}
}
uva 11916 Emoogle Grid的更多相关文章
- uva 11916 Emoogle Grid (BSGS)
UVA 11916 BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了. 代码如下: #include <cstdio> #i ...
- UVA 11916 Emoogle Grid(同余模)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 11916 Emoogle Grid 离散对数 大步小步算法
LRJ白书上的题 #include <stdio.h> #include <iostream> #include <vector> #include <mat ...
- UVA - 11916 Emoogle Grid (组合计数+离散对数)
假如有这样一道题目:要给一个M行N列的网格涂上K种颜色,其中有B个格子不用涂色,其他每个格子涂一种颜色,同一列中的上下两个相邻格子不能涂相同颜色.给出M,N,K和B个格子的位置,求出涂色方案总数除以1 ...
- [uva11916] Emoogle Grid (离散对数)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Emoogle Grid You have to color an MxN ( ...
- uva 11916 解模方程a^x=b (mod n)
Emoogle Grid You have to color an M x N ( 1M, N108) two dimensional grid. You will be provided K ...
- 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
因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色. 如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择. 反过来,如果一个格子位于第一列,或者上面相邻的格子 ...
- uva11916 Emoogle Grid (BSGS)
https://uva.onlinejudge.org/external/119/p11916.pdf 令m表示不能染色的格子的最大行号 设>m行时可以染k种颜色的格子数有ck个,恰好有m行时可 ...
随机推荐
- [转载]Eziriz .NET Reactor 4.7.0.0 官方原版+破解补丁(强大的代码保护和软件防盗版工具)
Eziriz .NET Reactor 是一个强大的代码保护和软件防盗版工具,完全由.NET框架编写..NET Reactor支持NET平台的软件许可系统,并支持NET程序集所有语言.当.Net编译器 ...
- 自助Linux之问题诊断工具strace
转 http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- Android名词解释
System Bars.Status Bar.Navigation Bar System Bars-->the Status bars and Navigation bars.
- Cloud Insight 和 BearyChat 第一次合体,好紧张!
说到 ChatOps 我们可能立刻想到是 Slack(啥?没听过?哦!),但是由于国内网络和语言的问题你可能无法拥有很好的体验了.那就把目光转回国内吧,国内的话就不得不提到 BearyChat 等 C ...
- SSH hibernate 使用时最好添加访问数据库的编码
SSH hibernate 使用时最好添加访问数据库的编码 如下所示:第13行为设置hibernate访问数据库的编码(&是&的转义序列) <!DOCTYPE hibernate ...
- JVM内存状况查看方法和分析工具
Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看.分析GC及JVM内存的状况.通过这些分析,可以排查程序中内存泄露的问题及 ...
- 获取View的高度宽度,屏幕参数,状态栏高度
基础 各区域示例,注意绿色,紫色,橙色区域 注意: 在onCreate只是对象的初始创建过程,这时并没有draw,这时view.getHeight返回0,可在onStart里用getHeight等. ...
- SequenceSum
SequenceSum Sum of 'n' Numbers sum_of_n (or SequenceSum.sumOfN in Java, SequenceSum.SumOfN in C#) ta ...
- Eclipse插件安装
在线安装(一定要保证网络畅通) 更新插件: Eclipse中,Help->Install New Software...从Work with下拉列表框中选择,通过该列表框可以选择Eclipse已 ...
- poj 3080 Blue Jeans(水题 暴搜)
题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...