UOJ #22 外星人
描述
2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机。
Picks游遍了宇宙,雇用了 个外星人来帮他作为信息传递机的中转站。我们将外星人依次编号为 到 ,其中 号外星人有 根手指。
外星人都是很低级的,于是Picks花费了很大的精力,才教会他们学会扳手指数数。
Picks现在准备传递 个脉冲信号给VFleaKing,于是他把信号发给 号外星人,然后 号外星人把信号发送给 号外星人, 号外星人把信号发送给 号外星人,依次类推,最后 号外星人把信号发给VFleaKing。
但是事情没有Picks想象的那么顺利,由于外星人手指个数有限,所以如果 号外星人收到了 个脉冲信号,他会错误的以为发送过来的是 个脉冲信号,导致只发送了 个脉冲信号出去。
Picks希望他发送出去的脉冲信号数量 与VFleaKing收到的脉冲信号数量 的差的绝对值尽量小。于是他决定通过重新排列这些外星人的顺序来达到这一目的。请你求出与 之差最小的 。除此之外,请求出有多少种排列外星人的方式能达到最优解,你只需要输出方案数对 ( ,一个质数)取模后的结果。
输入格式
第一行两个正整数 。
接下来一行有 个正整数 ,表示 号外星人的手指数。
输出格式
第一行一个整数表示最优情况下VFleaKing收到的脉冲数量。
第二行一个整数表示达到最优情况的方案数。
这些外星人原来并不是一个种族的=_=
题解(参考官方题解)
首先考虑 解决第一个问
枚举当前的脉冲信号个数,然后枚举一遍所有外星人,得出传递到下一步的脉冲信号个数
若最小的 为 ,那么最后的结果一定 ,只需要找到可行的最大的小于 的个数即可
虽然题目有限制,每一个外星人只能使用 次,而我们的枚举会把每个外星人枚举 次,看似会重复使用,但是实际上每个外形人也只能使用 次。使用 过后的结果一定小于 ,因此再多使用一次也不会改变结果。
考虑较高复杂度解决第二个问
我们对于当前的 ,相同的 仍然对应不同的情况,因为对于 ,使用后是不会影响 的结果的。所以说我们对于每一个 ,需要记录当前还有多少个 ,如此一来我们就能够得到一个使用 递推
而对于另外的 ,则有
此处 表示 的 的个数
而 对应的则是增加的 的个数
大概算一下吧
①枚举
②枚举
③枚举
共三层,复杂度约为
尝试简化
上面的两维状态尝试先减去第一维,也就是说记录当前某一类数字的个数,我发现我做不到
于是就按照官方题解把第二维省去
表示当前剩余的脉冲信号个数
那么我们就要想如何快速进行剩余的 数字个数的讨论
由于省去了第二维,所以我们在当前讨论 的时候就把 的数字讨论掉,这样子才不会出现多余的那一维
对于 ,剩余的位子实际上为 个,而下一个位子必定由 占领,而由 占领之后,其余的 则可以任意占领后面的位子,只有 的数字必须保持一定的顺序,或者说它们的顺序由后面的的讨论决定,我们当前无法确定这些数字的位置
因此这 的排列方案数为
递推式满足
时间复杂度减少为 ,空间复杂度减少为
附上代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const long long mod=998244353;bool mark[5678];
long long inv[5678],fac[5678],f[5678];
int n,x,mn=1e9,mx=0,C[5678],A[1234];int main()
{scanf("%d%d",&n,&x);inv[1]=inv[0]=fac[0]=1;for(int i=2;i<=x;i++)inv[i]=-(mod/i)*inv[mod%i]%mod;for(int i=2;i<=x;i++)inv[i]=(inv[i]*inv[i-1]%mod+mod)%mod;for(int i=1;i<=n;i++){scanf("%d",&A[i]);C[A[i]]++;mn=min(mn,A[i]);mx=max(mx,A[i]);}for(int i=1,mix=max(mx,x);i<=mix;i++)C[i]+=C[i-1];for(int i=1,mix=max(mx,n);i<=mix;i++)fac[i]=fac[i-1]*i%mod;sort(A+1,A+n+1); f[x]=fac[C[mx]]*inv[C[x]]%mod;mark[x]=1;int t=x;for(x=x;x;x--)if(mark[x]){for(int k=1;k<=n&&A[k]<=x;k++){mark[x%A[k]]=1;f[x%A[k]]=(f[x%A[k]]+f[x]*fac[C[x]-1]%mod*inv[C[x%A[k]]])%mod;}}for(int i=mn-1;i>=0;i--)if(mark[i]){printf("%d\n%lld",i,f[i]<0?f[i]+mod:f[i]);return 0;}
}复制代码
转载于:https://juejin.im/post/5a92755c5188257a76634884
UOJ #22 外星人相关推荐
- [总结]2019年9月 OI学习/刷题记录
从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...
- 一个IT从业者的课外读物
[传统文化篇] 序号 书名 作者 出版社 摘要 1 禅话 南怀瑾 复旦大学出版社 本书是台湾著名学者南怀瑾先生撰写的一部介绍早期禅宗的人物和史事的著作.讲解禅宗的形成.发展和演化,探求它在各个时期的特 ...
- 一个IT从业者的课外读物___传统文化篇
一个IT从业者的传统文化业余读物 [序] 跟大家一样,我也是一个IT从业者:然而,随着世事的迁移.技术的进步,自己已经很多年不再看技术类书籍了.但做软件开发的那些岁月让我养成看书的习惯.没技术书能看得 ...
- #22. 【UR #1】外星人
#22. [UR #1]外星人 2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 nn 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 ...
- 《请不要回应外星人2019》
作者 | 若名 出品 | AI科技大本营 今天早上,关于"加拿大天文学家发现 15 亿光年外讯号"的话题一度被推到了微博热搜榜第二位,当然也引发了全球范围内的关注.舆论导向都是,& ...
- JZOJ.5234【NOIP2017模拟8.7】外星人的路径
Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...
- UOJ #35. 后缀排序 后缀数组 模板
http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. 1 #include<i ...
- BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)
BZOJ 3218 UOJ #77 A+B Problem (主席树.最小割) 大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后 ...
- pygame外星人2
---恢复内容开始--- 一.game_functions将各个模块的功能整合起来,供主文件调用 1 # -*- coding:utf-8 -*- 2 3 import sys 4 import py ...
最新文章
- Linux 下使用 NMON 分析系统性能
- java解析xml的三种方法
- python买什么书好-python看什么书好
- python执行系统命令的方法
- 序列化和反序列化的概念与延伸【详细解释 + 样例演示】
- “Could not change executable permissions on the application”的原因和解决方法
- cuSPARSE库:(九)cusparseSetStream()
- [洪流学堂]Hololens开发入门篇1之模拟器开发环境配置
- pythonopencv算法_opencv python 光流法
- EXCEL生成SQL脚本
- w10电脑c盘满了怎么清理_快速清理:Win10系统C盘满了怎么办?
- 给大家分享几个经典c语言简单案例
- [iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments
- php 显示探针_雅黑php 探针
- 如何在html中使用特殊字体
- ubuntu16.04 联想拯救者y7000笔记本电脑安装1060显卡驱动,及ubuntu16.04更新内核
- 德州农工大学计算机专业研究生,德州农工大学计算机专业
- white-space:nowrap normal pre pre-wrap pre-line的区别以及pre和pre-wrap的“首行缩进“问题
- 预训练模型微调 | 一文带你了解Adapter Tuning
- 【Python】PyQt5入门