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 ...
随机推荐
- "ImportError: cannot import name OVSLegacyKernelSwitch"
My VirtualMachine OS is Ubuntu14.04, Linux. Recently I want to install the mininet in my OS, and I u ...
- Java循环跳转语句之 continue
continue 的作用是跳过循环体中剩余的语句执行下一次循环. 例如,打印 1--10 之间所有的偶数,使用 continue 语句实现代码为: 运行结果: continue与break的区别就是, ...
- RestTemplate请求https忽略证书认证
RestTemplate是Spring提供的用于访问Rest服务的客户端,提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.RestTemplate 默认使用J2SE提供的方式( ...
- Android自定义view-CircleSeekbar
自定义view练手,效果图如下:实现功能 可设置圆环颜色和线宽及触摸后的颜色和线宽 可设置圆环内圈显示的文本内容及字体大小.颜色 可设置触摸点的图片 可设置触摸的有效范围 源码git ...
- Decrypting OWIN Authentication Ticket
参考:https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ AuthServer产生的Token因为没有制定自定义的 ...
- Python 使用sys模块
你已经学习了如何在你的程序中定义一次函数而重用代码.如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块.模块基本上就是一个包含了所有你定义的函数和变量的文 ...
- 微信小程序------基本组件
今天主要是简单的讲一下小程序当中的一些组件,微信文档上也是有的.但我还是坚持写一下,因为写博客可以再一次得到提高,印象更深刻,虽然很简单,但贵在坚持. 先来看看效果图: 1:进度条(progress) ...
- Kotlin------函数和代码注释
定义函数 Kotlin定义一个函数的风格大致如下 访问控制符 fun 方法名(参数,参数,参数) : 返回值类型{ ... ... } 访问控制符:与Java有点差异,Kotlin的访问范围从大到小分 ...
- OBS插件学习入门:一个非常简单的、调节音量的filter
一个非常简单的.调节音量的filter,非线性调节: #include <obs-module.h> #include <math.h> struct volume_data ...
- HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)
题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...