题解

首先可以发现有效果的\(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. iOS 开发中的一些注意点(安全、当前语言、时间格式化)

    1.重复运行项目,不重复构建项目(来自Heath Borders) 假如你一直在不停地调试同一个问题,你可以在不重复构建的情况下运行你的APP,这样:“Product>Perform Actio ...

  2. [CPP] Coding Style

    C++ Coding Style C++很多强大的语言特性导致它的复杂,其复杂性会使得代码更容易出现bug.难于阅读和维护. 由于,本人有一点点代码洁癖,所以依照Google的C++编程规范<G ...

  3. redis一些笔记

    base 字典: hget/hset 在redis字典中值只能是字符串,使用渐进式进行rehash.在rehash的过程中,会保留两个hash结构:查询时会同时查询两个结构:逐渐完成hash的迁移. ...

  4. Retina屏幕下image-set

    实现Retina屏幕下图像的显示方法,还特别给我截取了一段代码: .soso .logo .qqlogo { display: block; width: 134px; height: 44px; b ...

  5. linux下把命令执行的结果输出

    我们知道在linux下当我们想把文字用命令输入到一个文本下时可以用echo命令 例:echo "nihao" > /z.txt   同样当我们想把命令执行的结果也输入到一个文 ...

  6. codeforces A. Punctuation 解题报告

    题目链接:http://codeforces.com/problemset/problem/147/A 题目意思:给定一篇文章,需要对这篇文章进行编辑,使得:(1)两个单词之间有一个空格分开  (2) ...

  7. 搜索算法 pots

    题目链接  点击打开链接 Pots Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Su ...

  8. Asterisk 拨号方案中截取字符串

    在dialplan中要截取字符串可用如下几种方式: 1.转到agi中由php进行处理,这种方法比较简单,在这里不再缀述 2.在dialplan中利用内置的方法进行截取 如 [test] exten = ...

  9. 并不对劲的loj3048:p5283:[十二省联考]异或粽子

    题目大意 有\(n\)(\(n\leq5\times10^5\))个数\(a_1,a_2,...a_n\)(\(a_i\leq 2^{32}-1\)) 求区间异或和前\(k(k\leq2\times1 ...

  10. POJ2823(优先队列)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 50738   Accepted: 14590 ...