题目链接

题意:

  有个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的更多相关文章

  1. [uva11916] Emoogle Grid (离散对数)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud  Emoogle Grid  You have to color an MxN ( ...

  2. UVA11916 Emoogle Grid

    Emoogle Grid You have to color an M × N (1 ≤ M, N ≤ 108 ) two dimensional grid. You will be provided ...

  3. UVA 11916 Emoogle Grid(同余模)

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

  4. UVa 11916 (离散对数) Emoogle Grid

    因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色. 如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择. 反过来,如果一个格子位于第一列,或者上面相邻的格子 ...

  5. uva 11916 Emoogle Grid

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

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

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

  7. uva11916 Emoogle Grid (BSGS)

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

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

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

  9. uva 11916 Emoogle Grid (BSGS)

    UVA 11916 BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了. 代码如下: #include <cstdio> #i ...

随机推荐

  1. MyEclipse10.0安装jad反编译插件

    1.下载反编译工具jad(下面提供下载) 将下载下来的jadstar158.zip解压缩,将jad.exe文件放入jdk安装目录下 如:C:\Program Files\Java\jdk1.6.0_2 ...

  2. spring beans源码解读之--bean definiton解析器

    spring提供了有两种方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即属性文件格式的bean ...

  3. myeclipse设置技巧

    如何设置jsp的默认打开为MyEclipse JSP Editor? windows -> General -> Editor - > File Associations 选择 *. ...

  4. 网络学习笔记----02--IGMP组播、ARP

    IGMP组播 :在路由器的接口上运行,周期性扫描本网段是否有绑定某个多播地址的计算机. ARP,全称Address Resolution Protoco,将广播中的IP地址解析成MAC地址 查看MAC ...

  5. 禁止输出重定向(>)覆盖已存在文件(防止误操作)

    在输出重定向中,>表示重定向并覆盖已有文件内容,为了防止误操作,覆盖重要的内容,可以使用如下命令: set -C 这样输出重定向到一个已有文件就会提示: cannot overwrite exi ...

  6. 利用mysql中的SQL_CALC_FOUND_ROWS 来实现group by后的记录数统计

    最近正在做一个显示消息的列表页,列表页中需要根据一个字段来分组显示.并且需要一个分页的效果. 大家也知道group by 后的数据是每一组一行记录,统计分组后的总的记录数又不能用count,所以SQL ...

  7. Frequent Pattern 挖掘之一(Aprior算法)(转)

    数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据 ...

  8. asp.net - GridView根据linkButton值不同跳转不同页面

    一,当前页面中,前台界面的主要代码: <asp:TemplateField HeaderText="姓名"> <ItemTemplate> <!--根 ...

  9. Nhibernate总结(一)查询返回指定字段

    项目查询中,常常需要返回指定的字段,下面是三种Nhibernate的方法1.linq to Nhibernatepublic class NameID{ public int Id { get; se ...

  10. iOS-assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义 assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值 ...