【UOJ#22】【UR #1】外星人(动态规划)

【UOJ#22】【UR #1】外星人(动态规划)

题面

UOJ

题解

一道简单题?
不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的。
设\(f[i][j]\)表示考虑了前\(i\)个数,模完之后是\(j\)的方案数。
转移的时候枚举这个数是模还是不模,如果不模的话就要把它放到后面某个小数的后面,方案数是\(n-i\)。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 5050
#define MOD 998244353
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
    int x=0;bool t=true;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=false,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?x:-x;
}
int n,x,a[MAX],f[MAX][MAX];
int main()
{
    n=read();x=read();
    for(int i=1;i<=n;++i)a[i]=read();
    sort(&a[1],&a[n+1]);reverse(&a[1],&a[n+1]);
    f[0][x]=1;
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<=x;++j)add(f[i][j],1ll*f[i-1][j]*(n-i)%MOD);
        for(int j=0;j<=x;++j)add(f[i][j%a[i]],f[i-1][j]);
    }
    for(int i=x;~i;--i)if(f[n][i]){printf("%d\n%d\n",i,f[n][i]);return 0;}
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/11049877.html

时间: 2024-08-28 13:13:07

【UOJ#22】【UR #1】外星人(动态规划)的相关文章

Uoj 22 外星人

Uoj 22 外星人 注意到一个数只有 \(\%\) 了小于等于自己的数时,才可能有变化,否则可以随意安排,不会对最后最优解造成影响. 用 \(f[x]\) 表示给一个数 \(x\) ,仅用 \(a[i]<=x\) 的 \(a[i]\) 时,得到的最大数.用 \(g[x]?\) 表示最优情况下的方案数目. 转移时,对于会造成影响的数,我们枚举第一个位置填的数,对于不会造成影响的数,就任意给它们钦定位置. 记 \(p=x\ mod\ a[i]\) ,\(count_k\) 表示小于等于 \(k\)

【UOJ#246】套路(动态规划)

[UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r-1),abs(a_r-a_l))\). 我们发现\(s(l,r)\le \frac{m}{r-l+1}\),那么当长度足够大的时候\(s(l,r)\)的取值很小. 所以我们对于询问分治处理,当长度小于\(\sqrt m\)时,直接\(dp\)计算贡献. 否则,当长度大于\(\sqrt m\)时,枚举

【UOJ#22】【UR#1】外星人

2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 n 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 1 到 n,其中 i 号外星人有 ai 根手指. 外星人都是很低级的,于是Picks花费了很大的精力,才教会他们学会扳手指数数. Picks现在准备传递 x 个脉冲信号给VFleaKing,于是他把信号发给1号外星人,然后1号外星人把信号发送给2号外星人,2号外星人把信号发送给3号外星人,依次类推,最后n号外星人把信号发给VFle

UOJ【UR #12】实验室外的攻防战

题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径与其他数字是否相交,相交就表示大小关系需要判断,(类似于二维偏序)用线段树维护区间最小值即可. 权值为1,2的线分别与权值为4的线相交,而且4在它们左边,所以需要判断它们的大小关系,发现${4>1}$,${4>2}$,所以满足条件. 1 #include<iostream> 2 #in

[UOJ #180][UR #12]实验室外的攻防战(树状数组)

Description 时针指向午夜十二点,约定的日子——2月28日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 picks 博士所在的实验室. 当然,picks 博士不会坐以待毙,他早就率领着他的猴子们在实验室外修筑了许多的坚固防御工事. 经过跳蚤侦察兵的勘察,跳蚤国王发现 picks 博士的防御工事有着 n 处薄弱点,于是他把他的跳蚤大军分成了 n 支小队,并打算让它们分别进攻每一个薄弱点.但是因为战场混乱,这 n 支小队的位置被打乱了,重新整队之后,跳蚤国王发现第 i

项目安排(动态规划)

项目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

五大常用算法:分治、动态规划、贪心、回溯、分支限界

分治:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并 http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html#3024443 ----------------------------------------------------------------------------------------------------

九度oj 题目1499:项目安排

题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

五大编程算法

分治:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并 http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html#3024443 ----------------------------------------------------------------------------------------------------