假如有这样一道题目:要给一个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到自闭..

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const ll N=+;
  6. const ll mod=1e8+;
  7. struct P {
  8. ll x,y;
  9. bool operator<(const P& b)const {return x!=b.x?x<b.x:y<b.y;}
  10. };
  11. ll n,k,b,r,ka;
  12. ll x[N],y[N],xm,all;
  13. set<P> st;
  14.  
  15. ll Pow(ll a,ll b) {
  16. ll ret=;
  17. for(; b; b>>=,a=a*a%mod)if(b&)ret=ret*a%mod;
  18. return ret;
  19. }
  20. ll inv(ll a) {return Pow(a,mod-);}
  21. ll Log(ll a,ll b) {
  22. ll m=sqrt(mod+0.5),v=inv(Pow(a,m));
  23. map<ll,ll> mp;
  24. for(ll i=,e=; i<m; ++i,e=e*a%mod)if(!mp.count(e))mp[e]=i;
  25. for(ll i=; i<m; ++i,b=b*v%mod)if(mp.count(b))return i*m+mp[b];
  26. return -;
  27. }
  28.  
  29. ll solve() {
  30. ll ans=Pow(k,all)*Pow(k-,n*xm-all-b)%mod;
  31. if(ans==r)return xm;
  32. ll cnt=;
  33. for(ll i=; i<b; ++i)if(x[i]==xm)++cnt;
  34. ans=ans*Pow(k,cnt)%mod*Pow(k-,n-cnt)%mod;
  35. if(ans==r)return xm+;
  36. return xm++Log(Pow(k-,n),r*inv(ans)%mod);
  37. }
  38.  
  39. int main() {
  40. ll T;
  41. scanf("%lld",&T);
  42. while(T--) {
  43. printf("Case %lld: ",++ka);
  44. xm=;
  45. st.clear();
  46. scanf("%lld%lld%lld%lld",&n,&k,&b,&r);
  47. all=n;
  48. for(ll i=; i<b; ++i) {
  49. scanf("%lld%lld",&x[i],&y[i]);
  50. xm=max(xm,x[i]);
  51. st.insert({x[i],y[i]});
  52. if(x[i]==)all--;
  53. }
  54. for(ll i=; i<b; ++i) {
  55. if(x[i]!=xm&&!st.count({x[i]+,y[i]}))all++;
  56. }
  57. printf("%lld\n",solve());
  58. }
  59. return ;
  60. }

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. MySQL数据库(3)_MySQL数据库表记录操作语句

    附: MYSQL5.7版本sql_mode=only_full_group_by问题 .查询当前sql_mode: select @@sql_mode .查询出来的值为: set @@sql_mode ...

  2. LeetCode:为运算表达式设置优先级【241】

    LeetCode:为运算表达式设置优先级[241] 题目描述 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含  ...

  3. asp.net 下载图片

    public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...

  4. Hibernate_HelloWord

    Hibernate操作步骤 1.新建项目 2.加jar包 3.写XML配置文件hibernate.cfg.xml 4.写log4j.properties日志文件 5.在MySql数据库中建studen ...

  5. flex 实现图片播放 方案二 把临时3张图片预加载放入内存

    该方案,是预加载:前一张,当前,下一张图片,一共3张图片放入内存中.这样对内存的消耗可以非常小,加载之后的图片就释放内存. 下面示例一个是类ImagePlayers,一个是index.mxml pac ...

  6. Using中return对象

    class Program { static void Main(string[] args) { Test test = new Test(); var a = test.CreateA(); te ...

  7. HTML5(。。。。不完整)

    <!DOCTYPE html>  不区分大小写 <header>.<nav>.<article>.<section>.<sidebar ...

  8. Python编程-常用模块及方法

    常用模块介绍 一.time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行 ...

  9. 主攻ASP.NET MVC4.0之重生:发邮箱激活验证

    导入Interop.jmail组件 using jmail;using System.Net.Mail; 点击下载源代码 Controller相关代码 public class SendEmailCo ...

  10. python装饰器实现HTTP请求耗时和入参返回日志记录

    装饰器方法: 1 def decoArgs(server_name): 2 def deco(func): 3 def wrapper(view, request, *args, **kwargs): ...