UVA - 11916 Emoogle Grid (组合计数+离散对数)
假如有这样一道题目:要给一个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 (组合计数+离散对数)的更多相关文章
- uva 11916 Emoogle Grid (BSGS)
UVA 11916 BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了. 代码如下: #include <cstdio> #i ...
- UVA 11916 Emoogle Grid 离散对数 大步小步算法
LRJ白书上的题 #include <stdio.h> #include <iostream> #include <vector> #include <mat ...
- UVA 11916 Emoogle Grid(同余模)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 11916 Emoogle Grid
题意:用K种颜色给一个N*M的格子涂色.其中有B个格子是不能涂色的.涂色时满足同一列上下紧邻的两个格子的颜色不同.所有的涂色方案模100000007后为R.现在给出M.K.B.R,求一个最小的N,满足 ...
- [uva11916] Emoogle Grid (离散对数)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Emoogle Grid You have to color an MxN ( ...
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- 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是第二类斯特林 ...
- 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是第二类斯特林 ...
- 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)
[HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...
随机推荐
- Linux 关机命令详解 转自脚本之家
在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的. Linux centos重启命令: 1. ...
- C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...
- MongoDB 使用Limit和Skip完成分页 和游标(二)
//$slice操作符返回文档中指定数组的内部值 //查询出Jim书架中第2~4本书 db.persons.find({name:"jim"},{books:{"$sli ...
- Python字符串格式转换
转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...
- google Json
gradle仓库地址: // https://mvnrepository.com/artifact/com.google.code.gson/gsoncompile group: 'com.googl ...
- 关于 kinect 的开发
1. 参考开发博客:http://www.cnblogs.com/yangecnu/p/Learning-KinectSDK.html
- 微软官网的office外接程序开发
链接地址:https://msdn.microsoft.com/zh-cn/library/fp161347.aspx
- 【P2325】王室联邦(树的遍历+贪心)
在肖明 #神#的推荐下,我尝试了这个题,一开始想的是暴力枚举所有的点,然后bfs层数,试着和肖明 #神#说了这种方法之后, #神#轻蔑的一笑,说这不就是一个贪心么,你只需要先建树,然后从底下向上遍历, ...
- EF Code-First 学习之旅 Fluent API
Mappings To Database Model-wide Mapping Set default Schema Set Custom Convetions Entity Mapping To S ...
- json数据的拼接与解析
json数据格式 [{ "firstName": "Brett", "lastName":"McLaughlin", & ...