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

本题的任务和这个相反:已知N,K,R和B个格子的位置,求最小可能的M。

蓝书(大白)上的例题,设xm为不能涂色的格子的最大x值,则分三种情况讨论:M=xm,M=xm+1,M>xm+1。前两种用组合公式直接算,第三种可设前xm+1行的格子涂色方法有n种,由于每增加一行,总涂色方案数增加p=(k-1)^N,于是有n*p^(M-xm-1)=R,用BSGS算法求出M-xm-1的值即可得到答案。

中间有一个连乘少取了一次模爆了longlong,差点debug到自闭..

 #include<bits/stdc++.h>

 using namespace std;
typedef long long ll;
const ll N=+;
const ll mod=1e8+;
struct P {
ll x,y;
bool operator<(const P& b)const {return x!=b.x?x<b.x:y<b.y;}
};
ll n,k,b,r,ka;
ll x[N],y[N],xm,all;
set<P> st; ll Pow(ll a,ll b) {
ll ret=;
for(; b; b>>=,a=a*a%mod)if(b&)ret=ret*a%mod;
return ret;
}
ll inv(ll a) {return Pow(a,mod-);}
ll Log(ll a,ll b) {
ll m=sqrt(mod+0.5),v=inv(Pow(a,m));
map<ll,ll> mp;
for(ll i=,e=; i<m; ++i,e=e*a%mod)if(!mp.count(e))mp[e]=i;
for(ll i=; i<m; ++i,b=b*v%mod)if(mp.count(b))return i*m+mp[b];
return -;
} ll solve() {
ll ans=Pow(k,all)*Pow(k-,n*xm-all-b)%mod;
if(ans==r)return xm;
ll cnt=;
for(ll i=; i<b; ++i)if(x[i]==xm)++cnt;
ans=ans*Pow(k,cnt)%mod*Pow(k-,n-cnt)%mod;
if(ans==r)return xm+;
return xm++Log(Pow(k-,n),r*inv(ans)%mod);
} int main() {
ll T;
scanf("%lld",&T);
while(T--) {
printf("Case %lld: ",++ka);
xm=;
st.clear();
scanf("%lld%lld%lld%lld",&n,&k,&b,&r);
all=n;
for(ll i=; i<b; ++i) {
scanf("%lld%lld",&x[i],&y[i]);
xm=max(xm,x[i]);
st.insert({x[i],y[i]});
if(x[i]==)all--;
}
for(ll i=; i<b; ++i) {
if(x[i]!=xm&&!st.count({x[i]+,y[i]}))all++;
}
printf("%lld\n",solve());
}
return ;
}

UVA - 11916 Emoogle Grid (组合计数+离散对数)的更多相关文章

  1. uva 11916 Emoogle Grid (BSGS)

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

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

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

  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种颜色给一个N*M的格子涂色.其中有B个格子是不能涂色的.涂色时满足同一列上下紧邻的两个格子的颜色不同.所有的涂色方案模100000007后为R.现在给出M.K.B.R,求一个最小的N,满足 ...

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

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

  6. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  7. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  8. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  9. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

随机推荐

  1. 模版抽离 优化url

    抽离出base模板 复制index的代码到base里面,指定views里面跳转到base.html,删除掉会变化的保留通用的 把主要内容写写在block里面,写了三个block {% block le ...

  2. PAT 天梯赛 L1-006. 连续因子 【循环】

    题目链接 https://www.patest.cn/contests/gplt/L1-006 思路 输出的连续因子 的乘积 也要是这个数的因子 就每个数先找它的单因子 然后每个单因子往上一个一个遍历 ...

  3. iOS 单例模式 学习 "52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码"

    百度定义:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将 ...

  4. SVN 过滤文件

    SVN新手最容易犯的一个错误: 就是把所有文件一股脑地全提交上去了. 这样很不好,因为这当中包含很多编译器自动生成的文件,还有中间文件. 这些文件可能每次编译都会不同,所以编译一次就冲突一次. 很显然 ...

  5. [SCOI2003]蜘蛛难题

    题目 对于当年来说似乎是神题?? 做法 对于联通注水来说,我们考虑把所有能平分到水的桶同时加高度,然后暴力判断 My complete code copy来的代码 #include <cstdi ...

  6. PS小研

    1 ps输入字体不显示原因有很多,解决方法也各不相同,我总结了以下几条原因及相应的解决方法 原因一: 字体颜色和背景色相同或者过于相近,字体虽然存在,但是却看不到字体. 解决方法: 这个问题比较简单, ...

  7. android开发之如何将一般应用变身系统级应用【转】

    本文转载自:https://blog.csdn.net/zanelove/article/details/43953743 前提: ROOT过的手机 1,把代码编写好后,打包导出apk,copy到手机 ...

  8. Cisco学习笔记

    目录 1. 路由 1.1 静态路由 1.2 动态路由 2. 访问控制列表 2.1 标准访问控制列表 2.2 扩展访问控制列表 2.3 命名访问控制列表 3. VLAN 3.1 基础知识 3.2 配置实 ...

  9. Sublime 输入中文显示方框问号乱码

     最近使用的sublime 编辑器出现了打开写好的程序,中文显示的确是方框,方框里面是问号,就是不显示中文.     然后再网上查找了一下,大概都是说是需要中文编码插件,比如converttoutf8 ...

  10. Whitewidow:SQL 漏洞自动扫描工具

    Whitewidow 是一个开源的 SQL 漏洞自动扫描器,可用通过文件列表运行,或者从 Google 爬取并发现有潜在漏洞的网站. 这个工具支持自动格式化文件.随机用户代理.IP 地址.服务器信息. ...