(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

智能推荐

(邱维声)高等代数课程笔记:解线性方程组的矩阵消元法_比较消元法和初等变换求线性方程组的异同,并阐述自己的收获-程序员宅基地

文章浏览阅读383次。根据邱维声老师的高等代数课程,整理的笔记。_比较消元法和初等变换求线性方程组的异同,并阐述自己的收获

android商城首页demo,FanZhengxi-程序员宅基地

文章浏览阅读281次。Android HyBridge 开发一、三种App开发方式对比1. Native App特点:UI元素、数据内容、逻辑架构都安装在手机终端,导致不可跨平台,每次版本升级都要重新打包。缺点:无法跨平台、升级麻烦、开发成本高(指跨平台开发成本高)优点:速度快,用户体验好。2. Web App定义:可理解为移动端的网站,将网页部署在服务器上,用户通过各大浏览器来访问。缺点:页面访问速度慢、用户体验差。..._安卓应用商店app demo

好烦!快让ChatGPT停止道歉!SD创作宣传图的超细教程;教你在PH冷启动薅流量;CSDN举办AI应用创新大赛 | ShowMeAI日报_inscode deecamp x csdn ai应用创新大赛-程序员宅基地

文章浏览阅读318次。Stable Diffusion 图生图知识思维导图;使用 5W1H 框架启动一个可控的AI项目;培生集团将生成式AI学习工具引入在线高等教育平台;前 Meta AI 高管离职创业,做教育类 ChatGPT 应用……点击阅读全文_inscode deecamp x csdn ai应用创新大赛

【21天算法挑战赛】查找算法——顺序查找_普通查找是顺序查找么-程序员宅基地

文章浏览阅读814次,点赞9次,收藏7次。作者简介:我目前是一个在校学生,现在不敢说自己擅长什么,但是我想通过自己的学习努力让自己的技术、知识都慢慢提升,希望我们一起学习呀~。有话想说:写博客、记笔记并不是一种自我感动,把学到的东西记在脑子里才是最重要的,在这个过程中,不要浮躁,希望我们都可以越来越优秀!由于算法不会改变原有的元素集合,只需要一个额外的变量控制索引变化,所以空间复杂度为常数级:O(1)️兴趣领域:目前偏向于前端学习 算法学习。语言说明:代码实现我会用Python/C++~空间复杂度:O(1)

【新书推荐】【2016.07】认知无线电天线设计_底层认知无线电-程序员宅基地

文章浏览阅读167次。【2016.07】认知无线电天线设计Antenna design for cognitive radio,共320页。如果需要电子版,请联系QQ:3042075372。本书从天线设计的角度阐述了认知无线电,并以一种协议的形式引入了认知无线电的概念,该协议受益于频谱中未被充分利用的区域。This one-of-a-kind new resource presents cognitive ra..._底层认知无线电

Linux基础命令-date设置时间_date设置当前日期-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏29次。date命令来自于英文单词它自己,也就是时间、时钟的意思,其功能是用于显示或者设置系统日期与时间信息的。运维人员可以根据自己需要的格式来输出系统时间信息。_date设置当前日期

随便推点

获取栅格图层(Raster)的属性表_r raster getvalue-程序员宅基地

文章浏览阅读388次。pNewRaster是你的Raster图层IRasterBandCollection pRasterBC =(IRasterBandCollection ) pNewRaster;IRasterBand pRasterBand = pRasterBC.Item(0);ITable pTable = pRasterBand.AttributeTable;IQueryFilter pQueryFilter=new QueryFilterClass ();pQueryFilter .WhereClau._r raster getvalue

python反编译class文件_python反编译之字节码-程序员宅基地

文章浏览阅读226次。如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件;它们的名称以.Py 结尾。你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python “字节码”文件。(在 Python3 的时候这个 .pyc 后缀的文件不太好找了,它在一个名为__pycache__的子目录下面。).pyc文件可以防止Python每次运行时都重新解析源代码,该文件大大节省了时间。..._python反编译class文件

hdu 2084 数塔(动态规划)-程序员宅基地

文章浏览阅读38次。本题是一个经典的动态规划题。直接利用记忆化搜索:见图解Ac code :#include<stdio.h>#include<string.h>#define max(i,j) (i>j?i:j)#define maxn 105int a[maxn][maxn];int d[maxn][maxn];int s(int i,...

VMware Workstation 10.0.7 安装-程序员宅基地

文章浏览阅读2.2k次。VMware Workstation 10.0.7 安装VMware Workstation 10.0.7 官网下载地址1、点击“exe.”开始安装,选择“下一步”;2、选择“接受”,点击“下一步”;3、选择“典型”,可更改安装路径;4、取消“启动时检查产品更新”、“帮助”选项;5、默认选项,点击“下一步”;6、正在安装VMware;7、输入密钥;8、安装成..._vmware workstation 10.0.7

Structured Streaming输出分析结果_pyspark structured streaming 打印-程序员宅基地

文章浏览阅读380次。一旦定义了最终结果DataFrame / Dataset,剩下的就是开始流式计算。为此,必须使用返回的 DataStreamWriter Dataset.writeStream()。_pyspark structured streaming 打印

队列的基本实现-程序员宅基地

文章浏览阅读863次,点赞28次,收藏12次。/ 链式结构:表示队列}QNode;// 队列的结构//头指针//尾指针int size;//数据个数}Queue;我们先定义节点用来存储指向下一个节点的指针和要保存的数据,然后定义指向队列的头指针和尾指针和存储数据的个数。// 初始化队列// 队尾 入队列// 队头 出队列// 获取队列头部元素// 获取队列队尾元素// 获取队列中有效元素个数// 检测队列是否为空,如果为空返回非零结果,如果非空返回0// 销毁队列。