题解

首先可以发现有效果的\(a_i\)大小一定是递减的,而且一定小于等于当前值

所以我们可以从大到小考虑每个\(a_i\),当确定了一个有效果的\(a_i\)时,\((a_i,x]\)的数都可以随意的放在\(a_i\)之后并且不会造成影响

设\(f_i\)表示考虑完所有的大小大于\(i\)数,当前数值为\(i\)的方案数

\(s_i\)表示\(\le i\)的数的个数

那么\(f_{i\%a[j]}=f_{i}\times A_{s_{i}-1-s[i\%a[j]]}^{s_i-1}\)

表示每次把\(i\%a[j]\sim i-1\)之间的数插在所有\(\le i\)之间的数的方案数

其实这个\(dp\)的过程就相当于把一个一个的数往数列里插入计算贡献,只不过这个\(dp\)的过程是反着的

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M = 5005 ;
const int mod = 998244353 ;
using namespace std ; inline int read() {
char c = getchar() ; int x = 0 , w = 1 ;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }
return x*w ;
} int n , m , x , minv = 5000 ;
int sum[M] , val[M] , f[M] ;
int inv[M] , fac[M] , finv[M] ; inline int A(int n , int m) {
return 1LL * fac[n] * finv[n - m] % mod ;
}
int main() {
n = read() ; x = read() ;
for(int i = 1 ; i <= n ; i ++) {
val[i] = read() ; minv = min( minv , val[i] ) ;
m = max(m , val[i]) ; ++ sum[val[i]] ;
}
for(int i = 1 ; i <= 5000 ; i ++) sum[i] += sum[i - 1] ;
inv[1] = 1 ; for(int i = 2 ; i <= 5000 ; i ++) inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod ;
fac[0] = 1 ; for(int i = 1 ; i <= 5000 ; i ++) fac[i] = 1LL * fac[i - 1] * i % mod ;
finv[0] = 1 ; for(int i = 1 ; i <= 5000 ; i ++) finv[i] = 1LL * finv[i - 1] * inv[i] % mod ;
f[x] = 1LL * fac[n] * finv[sum[x]] % mod ;
for(int i = x ; i ; i --)
for(int j = 1 ; j <= n ; j ++)
if(val[j] <= i)
f[i % val[j]] = ( f[i % val[j]] + 1LL * f[i] * A( sum[i] - 1 , sum[i] - sum[i % val[j]] - 1 ) % mod ) % mod ;
for(int i = minv - 1 ; i >= 0 ; i --)
if(f[i]) {
printf("%d\n%d\n",i , f[i]) ;
break ;
}
return 0 ;
}

[UOJ22]外星人的更多相关文章

  1. uoj22 外星人(dp)

    题目大意: 给定一个\(n\)个数的序列\(a\),给定一个\(x\),其中\(a\)数组可以进行顺序的调换,每一个\(a_i\)都能使$x=x \mod a_i \(, 求最后经过一系列计算后的\) ...

  2. #YCB#待做题目与填坑资料

    各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...

  3. UOJ22 UR #1外星人(动态规划)

    https://www.cnblogs.com/Gloid/p/10629779.html 这一场的D. #include<bits/stdc++.h> using namespace s ...

  4. UOJ22. 【UR #1】外星人【DP】【思维】

    LINK 题目大意 给你一个序列和一个值x 问你用某种方式对序列安排顺序之后一次对x取mod膜的最大值和方案数 首先发现一个性质 一个数之后所有比它大的数都没有贡献 考虑怎么利用这个性质? 就可以从小 ...

  5. uoj22 【UR #1】外星人

    link 题意: 给一个长为n的序列a[],现在有一个初始值m,问一个1~n的排列p[],满足将m对a[p[i]]顺次取模后得到的值最大,输出最大值和方案数. $n,m\leq 5\times 10^ ...

  6. TYVJ P1024 外星人的密码数字

    做题记录:2016-08-16 20:09:30 描述     XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星人用26个英文字母组成的单词中最长不降子序列的长度来表述数字,且 ...

  7. P1024 外星人的密码数字

    P1024 外星人的密码数字 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星 ...

  8. Bzoj 2749: [HAOI2012]外星人 欧拉函数,数论,线性筛

    2749: [HAOI2012]外星人 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 568  Solved: 302[Submit][Status][ ...

  9. nyoj 710 外星人的供给站【贪心区间选点】

    外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命 ...

随机推荐

  1. LVS集群的负载调度

    LVS集群的负载调度 章文嵩 (wensong@linux-vs.org) 转自LVS官方资料 2002 年 5 月 本文主要讲述了LVS集群的IP负载均衡软件IPVS在内核中实现的各种连接调度算法. ...

  2. Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm

    <一>˙转换 Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤: 最新版本的Em ...

  3. SP8093 JZPGYZ - Sevenk Love Oimaster

    传送门 广义后缀自动机-- 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点. 这个题我们首先要预处理出来每个状态被多少个串共用.挺暴力的 ...

  4. RQNOJ魔法石之恋

    魔法石之恋 (stone.pas/c/cpp) [问题描述] 在<Harry Potter and the Sorcerer's Stone>中,想得到魔法石,必须要通过许许多多的测试和游 ...

  5. Numpy 小结

    Python 真火来学习一下,先来看一个库 NumPy.NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1. 读取文件 num ...

  6. JavaScript DOM 编程艺术 ---> JavaScript语法

    二.  JavaScript语法目录 2.1 语法 javaScript代码要通过HTML/XHTML文档才能执行.可以有两种方式完成这一点,第一种是将JavaScript代码放到文档<head ...

  7. Nwjs简单配置

    1.创建一个工程,配置一个  package.json 文件 { "name": "application-name", "version" ...

  8. docker集群管理

    docker集群管理 ps:docker machine     docker swarm       docker compose  在Docker Machine发布之前,你可能会遇到以下问题: ...

  9. 如何正确遍历删除List中的元素,你会吗?

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

  10. Jacob开发文件转PDF

    这三种方法我都有试过word转PDF,第2种.第3种对于图片,表格.中文转换效果都不好,方法1效果最好.但方法1 只支持Windows环境下. 1.开发环境 Windows系统: 2.准备工作: st ...