(UVA)11916 Emoogle Grid-程序员宅基地

技术标签: 人工智能  

题意:一个N列的网格,有B个格子可以不涂色,其他格子各涂一种颜色,现在一共有k种颜色,要求同一列格子颜色不能相同,问总方案数 MOD 100000007答案等于R时最小的M是多少。

思路:首先这个m一定是大于等于所给的不能放的点的x的最大值。我们可以先统计出当前矩阵的方案数,我们知道如果当前格子上面能放东西,当前格子的方案数是k-1,否则就是k种,然后乘法原理,所以先判断下当前的m是否符合,然后不符合的情况下,再加一层,再判断下,算出当前答案cnt,你再往下加层数的时候情况是一样的,都是cnt*((k-1)^n);然后就转换成

求cnt*((k-1)^(n*t))%mod = r;然后大步小步算出t的最小值再加上原来m就是答案,复杂度(sqrt(mod));

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<stdlib.h>
  4 #include<iostream>
  5 #include<queue>
  6 #include<math.h>
  7 #include<map>
  8 #include<vector>
  9 #include<string.h>
 10 #include<set>
 11 typedef long long LL;
 12 using namespace std;
 13 typedef struct pp {
 14         int x;
 15         int y;
 16 } ss;
 17 ss ans[100005];
 18 ss bns[100005];
 19 set<pair<int,int> >vec;
 20 const  LL mod = 100000007;
 21 bool cmp(pp p, pp q) {
 22         if(p.x == q .x)
 23                 return p.y < q.y;
 24         return p.x < q.x;
 25 }
 26 LL coutt(int m,int n,int b,int k);
 27 LL quick(LL n, LL m);
 28 LL solve(int n,int m,int b,int k,int r);
 29 LL BSS(LL kk,LL k,LL cnt,LL n);
 30 int er(int n,int m,LL fin);
 31 ss cn[100005];
 32 int main(void) {
 33         int T;
 34         int __ca = 0;
 35         scanf("%d",&T);
 36         while(T--) {
 37                 __ca++;
 38                 int  n, k, b,r;
 39                 vec.clear();
 40                 scanf("%d %d %d %d",&n,&k,&b,&r);
 41                 int i,j;
 42                 int  m = 1;
 43                 for(i = 0 ; i  < b; i++) {
 44                         scanf("%d %d",&ans[i].x,&ans[i].y);
 45                         if(ans[i].x > m)m = ans[i].x;
 46                         pair<int,int>ac = make_pair(ans[i].x,ans[i].y);
 47                         // printf("%d %d\n",ans[i].x,ans[i].y);
 48                         vec.insert(ac);
 49                 }
 50                 printf("Case %d: %lld\n",__ca,solve(n,m,b,k,r));
 51         }
 52         return 0;
 53 }
 54 LL coutt(int m,int n,int b,int k) {
 55         LL sum = 0;
 56         for(int i = 0; i < b; i++) {
    //printf("%d\n",ans[i].x);
 57                 if(ans[i].x != m&& !vec.count(make_pair(ans[i].x+1,ans[i].y)))
 58                         sum++;
 59                 if(ans[i].x == 1) {
 60                         sum--;
 61                 }
 62         }
 63         sum += n;
 64         LL dt = quick((LL)k,sum)%mod;
 65         dt =  dt*quick((LL)(k-1),(LL)m*(LL)n-b-sum)%mod;
 66         return dt % mod;
 67 }
 68 LL quick(LL n, LL m) {
 69         LL ask = 1;
 70         n %= mod;
 71         while(m) {
 72                 if(m&1)
 73                         ask =  ask*n %mod;
 74                 n = n*n %mod;
 75                 m>>=1;
 76         }
 77         return ask ;
 78 }
 79 LL solve(int n,int m,int b,int k,int r) {
 80         LL cnt = coutt(m,n,b,k);
 81         if(cnt == r)
 82                 return (LL)m;
 83         int i,j;
 84         int ac = 0;
 85         for(i = 0; i < b; i++) {
 86                 if(ans[i].x == m) {
 87                         ac++ ;
 88                 }
 89         }
 90         //printf("%lld\n",cnt);
 91         m++;
 92         LL ak = quick((LL)k,ac);
 93         cnt = cnt *ak %mod;
 94         ak = quick((LL)(k-1),n-ac);
 95         cnt = cnt *ak%mod;
 96         if(cnt == r)
 97                 return (LL)m;
 98         LL tp = quick((LL)(k-1),n);
 99         LL kk = (LL)r;
100         return (m+BSS(kk,(LL)k,cnt,n))%mod;
101 }
102 LL BSS(LL kk,LL k,LL cnt,LL n) {
103         int i,j;
104         LL ni = quick(cnt,mod-2);
105         kk = kk*ni%mod;
106         LL ak = quick(k-1,n)%mod;
107         LL modd = sqrt(1.0*mod);
108         LL ac = kk;
109         LL nii = quick(ak,mod-2);
110         for(i = 0; i < modd; i++) {
111                 bns[i].x = ac;
112                 bns[i].y = i;
113                 ac = ac*nii%mod;
114         }
115 
116         sort(bns,bns+modd,cmp);
117         int cnn = 1;
118         cn[0] = bns[0];
119         int c = bns[0].x;
120         for(i = 1; i <modd; i++) {
121                 if(c!=bns[i].x) {
122                         c=bns[i].x;
123                         cn[cnn]=bns[i];
124                         cnn++;
125                 }
126         }
127         LL akk = 1;
128         LL app = quick(ak,modd);
129         for(i = 0; i <= modd+1; i++) {
130                 int ack = er(0,cnn,akk);
131                 if(ack!=-1) {   //printf("%d %lld\n",i,ack);
132                         return modd*(LL)i+(LL)ack;
133                 }
134                 akk = akk*app%mod;
135         }
136 }
137 int er(int n,int m,LL fin) {
138         if(n>m)
139                 return -1;
140         int mid = (n+m)/2;
141         if(cn[mid].x == fin) {
142                 return cn[mid].y;
143         } else if(cn[mid].x > fin) {
144                 return er(n,mid-1,fin);
145         } else return er(mid+1,m,fin);
146 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5818461.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30377461/article/details/99914466

智能推荐

DedeCMS织梦框架识别_织梦的框架-程序员宅基地

文章浏览阅读280次。DedeCMS框架_织梦的框架

Windows UAC权限详解以及因为权限不对等引发的若干问题分享-程序员宅基地

文章浏览阅读1.3w次,点赞103次,收藏97次。Windows UAC权限详解以及因为权限不对等引发的若干问题分享。_uac权限

目标检测:数据集划分 & XML数据集转YOLO标签-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏20次。目标检测的数据集划分以及XML格式转为YOLO的Label格式

jupyter下使用conda环境_jupyter conda-程序员宅基地

文章浏览阅读1.7k次。安装nb_condaconda install nb_conda安装完成后,jupyter notebook中多了Conad选项卡,但此时还不能用,还需要在每一个虚拟环境中安装jupyter.在虚拟环境中安装jupyter进入虚拟环境,Linux&mac环境:source activate your_env_name,在windows下执行conda activate your_env_name在虚拟环境中安装jupyter:pip install ipykernel,这样重新执行j_jupyter conda

【长期更新】 PHP题目-程序员宅基地

文章浏览阅读74次。1.要求在一组数中,插入一个新数,并维护原来的排序方式不变<?php//1.要求在一组数中,插入一个新数,并维护原来的排序方式不变function insertArr($arr,$val){ $pos=0; if (sizeof($arr)==0) return array($val); //传入数组没有值 if (sizeof(..._php 要求在一组数中,插入一个新数,并维护原来的排序方式不变

9.3 Java反射reflect()-程序员宅基地

文章浏览阅读57次。掌握Class.forName方法及获取其对象的属性方法等

随便推点

MySQL的分布式——flask-sqlalchemy实现读写分离_flask-sqlalchemy分表解决方案-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏12次。目录1、复制1.1 主从架构(一主多从)1.2 主备架构1.3 高可用复合架构2、flask-sqlalchemy实现读写分离3、分片3.1 垂直拆分3.1.1 垂直分表3.1.2 垂直分库3.2 水平拆分3.2.1 水平分表4、分布式的问题4.1 分布式事物问题解决方案4.2 解决跨节点 Join/排序/分页1、复制作用:对数据进行备份,实现高可用HA通过读写分离,提高吞吐量,实现高性能原理:当主库中有数据更新时,主库会将该操作写入一个二进制日志文件中,从库中专门有一个io线程去读取主库_flask-sqlalchemy分表解决方案

python 内存不足报错_Spark排错与优化-程序员宅基地

文章浏览阅读840次。一. 运维1. Master挂掉,standby重启也失效Master默认使用512M内存,当集群中运行的任务特别多时,就会挂掉,原因是master会读取每个task的event log日志去生成Spark ui,内存不足自然会OOM,可以在master的运行日志中看到,通过HA启动的master自然也会因为这个原因失败。解决增加Master的内存占用,在Master节点spark-env.sh ..._a task of very large size

终究还是一只菜鸟(转)-程序员宅基地

文章浏览阅读62次。本来打算一切都尘埃落定再去写东西。可是如果这么一直等下去,真不知道还有没有写的可能啦。 写技术不是件容易的事情突然发现记录生活和写技术日志需要特殊的热情和持久的耐性。生活本身就不容易,做技术也很不容易,我们还要协调,思考,沟通。。。那么最后托着疲惫的身体,麻木的灵魂还能写出什么来呢。。。所以我对那些一只孜孜不倦的写技术日志的人还是充满着敬意和羡慕。羡慕他们在兴趣的驱动下..._最终难得迎来一只菜鸟

IOT物联网概述及应用层架构入门篇_iot物模型 如何对接-程序员宅基地

文章浏览阅读3.6k次,点赞8次,收藏59次。本文是本着了解物联网原理及如何架构软件到具体案例的应用而梳理的一篇文章,学习了多位前辈的成果,有不足的地方请及时指正。_iot物模型 如何对接

python的星号(*)和双星号(**)运算符的使用_用双星号可变参数最大值,最小值怎么算-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏3次。在python中,1,星号(*)运算符可以用在两个位置,函数定义和展开集合def func1(*args): #用星号定义可变参数列表 for arg in args: print 'arg=',argif __name__ == '__main__': func1(1,2,3,4)# args={'a':1,'b':2,'c':3,'d':4}..._用双星号可变参数最大值,最小值怎么算

org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping for GET/*-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏8次。一般出现这个原因就要去Springmvc.xml下去查看自己的配置文件有没有出错注意<mvc:annotation-driven />是把映射器和适配器给打开还有注意@Controller注释把ExceptionController封装成对象,要不然也会报错注意<url-pattern>/</url-pattern>拦截”/*”,这是一个错误的..._org.springframework.web.servlet.dispatcherservlet.nohandlerfound no mapping