(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

智能推荐

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

云解析DNS使用教程_aiyun的云解析dns服务是什么-程序员宅基地

文章浏览阅读2.4k次。课程介绍云解析(Domain Name System,简称DNS)是一种高可用性、高可扩展的权威DNS服务和DNS管理服务。它的目的是为企业和开发者提供稳定、安全、智能的把网站域名或应用资源转换为计算机用于互连的数字 IP地址,从而将最终用户的访问路由到相应的网站或应用资源上同时提供DNS的管理服务。产品详情:https://wanwang.aliyun.com/domain/dns/_aiyun的云解析dns服务是什么

3dmax 使用中的遇到的问题_mmd文件导入3ds max-程序员宅基地

文章浏览阅读1.1k次。2020版本,也许其它安装类型的脚本也可以用同样的方式清理删除""文件夹,注意里面是配置文件,删除前记得备份。同时清理注册表。_mmd文件导入3ds max

页面跳转并数据传递-不同页面的传递数据_cshtml 跳转页面并传整行数据-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏19次。1、第一个登录页面,里面有提交表单,action提交到index页面2、第二个页面,可以使用第一个页面的参数,实现一个数据不同页面之间的传递效果3、第二个页面之所以可以使用第一个页面的数据,就是利用了URL里面的location.search参数4、第二个页面提取参数5、去掉?6、分隔符分开表单form:可以将内容提交到另外一个页面上输入页面:<!DOCTYPE html><html lang="en"><head> ._cshtml 跳转页面并传整行数据

许愿墙 许下你的愿望_编程实现许愿墙的页面结构,效果图如下:-程序员宅基地

文章浏览阅读829次,点赞2次,收藏17次。许愿墙 许下你的愿望_编程实现许愿墙的页面结构,效果图如下:

【100%通过率】华为OD机试真题 Python 实现【最差产品奖】【2022.11 Q4 新题】-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏3次。A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。_最差产品奖

随便推点

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

企业级数据分析平台/springBoot-controller全局异常管理_naga数据分析平台-程序员宅基地

文章浏览阅读135次。我们要通过实现三个类,来实现一个web后端的全局异常管理功能,捕获controller层异常,封装成map集合,进行返回1.实现异常处理的工具类实现一个imooc.naga.core.exception,异常处理的包,定义两个类分别是:1.系统返回状态标识码实体类,2:封装了异常状态值,和异常信息内容的实体类1.系统返回状态标识码实体类package imooc.naga.core.exception;/** * 定义我们系统返回值的状态标志 */public class ErrorCo_naga数据分析平台

Matlab 读取批量txt格式的气象数据_读取气象a文件-程序员宅基地

文章浏览阅读394次,点赞8次,收藏9次。fileFolder=fullfile('G:\气象数据\sitedata\day_temperature1951_2017');%将从该文件夹中提取的数据并入到上一个文件夹中的数据,;%如果该文件夹里有该站点的数据,则min_line不是空。_读取气象a文件

Java乐观锁-程序员宅基地

文章浏览阅读2.2k次,点赞5次,收藏9次。乐观锁是一种并发控制的策略,它假设多个线程在操作共享数据时,不会发生冲突,因此不需要加锁,而是在更新数据时,通过比较当前状态和上一次的状态,来判断是否有其他线程修改了数据。版本号控制的思想是,在数据表中增加一个版本号字段(或者时间戳字段),每次更新数据时,都将版本号加一(或者更新时间戳),并且在更新时,检查当前的版本号是否和数据库中的一致,如果一致,就执行更新操作;ABA问题是指,在一个线程执行CAS操作时,发现内存中的值没有变化(仍然为A),就认为没有其他线程修改过这个值,然后执行更新操作。_乐观锁

推荐文章

热门文章

相关标签