Uoj 22 外星人
Uoj 22 外星人
- 注意到一个数只有 \(\%\) 了小于等于自己的数时,才可能有变化,否则可以随意安排,不会对最后最优解造成影响.
- 用 \(f[x]\) 表示给一个数 \(x\) ,仅用 \(a[i]<=x\) 的 \(a[i]\) 时,得到的最大数.用 \(g[x]\) 表示最优情况下的方案数目.
- 转移时,对于会造成影响的数,我们枚举第一个位置填的数,对于不会造成影响的数,就任意给它们钦定位置.
- 记 \(p=x\ mod\ a[i]\) ,\(count_k\) 表示小于等于 \(k\) 的 \(a[i]\) 个数,容易写出转移方程:
g[x]=\sum_{a[i]\leq x\ ,\ f[p]=f[x]}g[p]*A(count_x-1,count_p-1)
\]
- 边界条件:
g[x]=1,count_x=0
\]
- 最后输出答案的时候还要注意大于给出 \(x\) 的数可以任意放.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int P=998244353;
inline int add(int a,int b)
{
return (a + b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
int fpow(int a,int b)
{
int res=1;
while(b)
{
if(b&1)
res=mul(res,a);
a=mul(a,a);
b>>=1;
}
return res;
}
const int MAXN=1e3+10,MAXV=5e3+10;
int n,X;
int a[MAXN],f[MAXV],g[MAXV];
int fac[MAXV],invfac[MAXV];
void init()
{
int lim=5000;
fac[0]=1;
for(int i=1;i<=lim;++i)
fac[i]=mul(fac[i-1],i);
invfac[lim]=fpow(fac[lim],P-2);
for(int i=lim-1;i>=0;--i)
invfac[i]=mul(invfac[i+1],i+1);
}
int A(int n,int m)
{
if(m<0 || n<0 || m>n)
return 0;
return mul(fac[n],invfac[n-m]);
}
int count(int L,int R)//计算a数组从L到R有多少个数
{
if(L>R)
return 0;
int l=lower_bound(a+1,a+1+n,L)-a;
int r=upper_bound(a+1,a+1+n,R)-a-1;
return r-l+1;
}
int dfs(int x)
{
if(f[x]!=-1)
return f[x];
f[x]=-1,g[x]=0;
int k=count(1,x);
if(k==0)
{
f[x]=x;
g[x]=1;
return x;
}
for(int i=1;i<=n;++i)
{
if(a[i]<=x)
{
int p=x%a[i];
f[x]=max(f[x],dfs(p));
}
else
break;
}
for(int i=1;i<=n;++i)
{
if(a[i]>x)
break;
int p=x%a[i];
if(f[p]!=f[x])
continue;
int tmp=g[p];
int tot=count(1,x)-1,par=count(p+1,x)-1;
tmp=mul(tmp,A(tot,par));
g[x]=add(g[x],tmp);
}
return f[x];
}
int main()
{
init();
n=read(),X=read();
memset(f,-1,sizeof f);
for(int i=1;i<=n;++i)
a[i]=read();
sort(a+1,a+1+n);
dfs(X);
int t=count(X+1,a[n]);
printf("%d\n%d\n",f[X],mul(g[X],A(n,t)));
return 0;
}
Uoj 22 外星人的更多相关文章
- 【UOJ#22】【UR #1】外星人(动态规划)
[UOJ#22][UR #1]外星人(动态规划) 题面 UOJ 题解 一道简单题? 不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的. 设\(f[i][j ...
- 【UOJ#22】【UR#1】外星人
2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 n 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 1 到 n,其中 i 号外星人有 ...
- UOJ #22 UR #1 外星人
LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...
- 【uoj#22】[UR #1]外星人 组合数学+dp
题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...
- UOJ#22. 【UR #1】外星人
传送门 分析 我们发现一个很神的性质,就是对于一个数如果放在它之前的数小于它那它一定对答案没有贡献 于是我们用dp[i][j]表示从大往小考虑了前i个数,当前答案是j的方案数 我们知道它由两种情况转移 ...
- 「总结」$dp1$
大概就是做点题. 先列一下要做的题目列表,从\(UOJ\)上找的. 129寿司晚宴 348州区划分 370滑稽树上滑稽果 457数树 22外星人 37主旋律 300吉夫特 196线段树 311积劳成疾 ...
- UOJ 外星人
题目: 2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机.Picks游遍了宇宙,雇用了n个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为1 到n,其中i 号外星人有ai ...
- 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)
传送门 题意简述: 要求支持以下操作: 在a与b之间连一条长度为i的边(i是操作编号):删除当前图中边权最大的k条边:表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作. 要求在每次操作后 ...
- UOJ Round #1 [数论 | DP 排列]
UOJ Round #1 难度很良心啊! 做出了前两题,第三题看到仙人掌就吓哭了. [UR #1]缩进优化 就是求 \[ \sum_{i=1}^n a_i - (x-1)\sum_{i=1}^n\lf ...
随机推荐
- maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7006@17006"
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [redis.client ...
- 全文检索引擎Solr系列——整合中文分词组件mmseg4j
默认Solr提供的分词组件对中文的支持是不友好的,比如:“VIM比作是编辑器之神”这个句子在索引的的时候,选择FieldType为”text_general”作为分词依据时,分词效果是: 它把每一个词 ...
- java工具类使用
ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "C ...
- 前端要不要学数据结构&算法
我们都知道前端开发工程师更多偏向 DOM 渲染和 DOM 交互操作,随之 Node 的推广前端工程师也可以完成服务端开发.对于服务端开发而言大家都觉得数据结构和算法是基础,非学不可.所以正在进行 No ...
- Hive 表结构操作
添加列 add columns alter table table_name add columns (id int comment '主键ID' ) ; 默认在表所有字段之后,分区字段之前. 替换 ...
- WPF TextBox 获得焦点后,文本框中的文字全选中
textbox.GotFocus 事件处理 Textbox.SelectAll() 是不行的, 这样处理会发生的情况是: 1) textbox1 当前没有焦点, 内容为 someText. 2) 鼠标 ...
- iometer测试磁盘IO性能
of Outstanding I/Os per target – 被选中worker的每个磁盘一次所允许的未处理的异步I/O的数量.模拟测试多个应用向 IO 请求读写,默认是 1.通常不用这个参数,除 ...
- Ubuntu 无法获得锁
使用ubuntu安装pip 时,出现以下错误: E: 无法获得锁 /var/cache/apt/archives/lock – open (11 资源临时不可用) E: 无法锁定下载目录 解决方法: ...
- Truncate a string
用瑞兹来截断对面的退路! 截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数num小于 ...
- js鼠标键禁用功能
页面完全禁用右键 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...