LINK


题目大意

给你一个序列和一个值x

问你用某种方式对序列安排顺序之后一次对x取mod膜的最大值和方案数

首先发现一个性质

  • 一个数之后所有比它大的数都没有贡献

考虑怎么利用这个性质?

就可以从小到大插入每一个数

然后就开开心心的发现每次插入的数如果有贡献一定是在第一个,否则可以在任意位置

然后就可以非常自然地令\(f_{i,j}\)表示初始数是i,放入前j个数的最大值

然后转移就是枚举当前有没有贡献\(f[i][j] = \max(f[i][j - 1], f[i\% a[j]][j - 1])\)

注意特判边界

然后第一问就做完了

考虑第二问,\(g_{i,j}\)表示初始数是i,放入前j个并到达当前最优状态的最大值

每次直接判断两个值是一样大还是一个比另一个更大,累加贡献就可以啦


注意i是0也要算方案数哦!


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
typedef pair<int, int> pi;
typedef long long ll;
typedef double db;
#define fi first
#define se second
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 5e3 + 10;
const int Mod = 998244353;
int n, x, a[N];
int f[N][N], g[N][N]; int add(int a, int b) {
return (a += b) >= Mod ? a - Mod : a;
} int mul(int a, int b) {
return 1ll * a * b % Mod;
} int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
Read(n), Read(x);
fu(i, 1, n) Read(a[i]);
sort(a + 1, a + n + 1);
fu(i, 0, x) f[i][0] = i;
fu(i, 0, x)
fu(j, 1, n) {
if (j == 1) f[i][j] = i % a[j];
else f[i][j] = max(f[i][j - 1], f[i % a[j]][j - 1]);
}
Write(f[x][n]), putchar('\n');
fu(i, 0, x) g[i][1] = 1;
fu(i, 0, x) {
fu(j, 2, n) {
g[i][j] = 0;
if (f[i][j - 1] >= f[i % a[j]][j - 1]) {
g[i][j] = add(g[i][j], mul(g[i][j - 1], j - 1));
}
if (f[i][j - 1] <= f[i % a[j]][j - 1]) {
g[i][j] = add(g[i][j], g[i % a[j]][j - 1]);
}
}
}
Write(g[x][n]);
return 0;
}

UOJ22. 【UR #1】外星人【DP】【思维】的更多相关文章

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

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

  2. UOJ #22 UR #1 外星人

    LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...

  3. 【uoj#22】[UR #1]外星人 组合数学+dp

    题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...

  4. cf1153D 树形dp+思维

    一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...

  5. E. The Contest ( 简单DP || 思维 + 贪心)

    传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...

  6. 7月15日考试 题解(链表+状压DP+思维题)

    前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...

  7. codeforces 1140D(区间dp/思维题)

    D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  8. POJ 1390 Blocks(DP + 思维)题解

    题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...

  9. “玲珑杯”ACM比赛 Round #18---图论你先敲完模板(DP+思维)

    题目链接 DESCRIPTION INPUT OUTPUT SAMPLE INPUT 2 3 2 3 5 7 3 10 3 5 7 SAMPLE OUTPUT 12 26 HINT 官方题解: 代码如 ...

  10. HDU - 5117 Fluorescent(状压dp+思维)

    原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...

随机推荐

  1. 3.12 Templates -- Wrting Helpers(编写辅助器)

    一.概述 1. Helpers允许你向你的模板添加超出在Ember中开箱即用的额外的功能.辅助器是最有用的,用于将来自模型和组件的原始值转换成更适合于用户的格式. 2. 例如,假设我们有一个Invoi ...

  2. mysql8新特性(一)

    https://www.oschina.net/news/95325/mysql-8-0-ga-released http://blog.itpub.net/28218939/viewspace-21 ...

  3. Spring—spring概述

    Spring框架的特点? 1:轻量级,一站式开发 2:易用,追求代码的最佳实现 3:Spring的内容: a:Ioc容器 b:AOP实现 c:数据访问支持(ORM框架/声明事务[Transaction ...

  4. MapReduce: number of mappers/reducers

    14 down vote It's the other way round. Number of mappers is decided based on the number of splits. I ...

  5. 什么是T-SQL

    T-SQL T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言.T-SQL 提供 ...

  6. jQuery源码分析--Event模块(2)

    接下来就是触发事件了.事件触发后的处理函数的分发主要靠两个函数,一个jQuery.event.dispatch,一个是jQuery.event.handlers.这个dispatch会调用handle ...

  7. 通过委托来实现异步 Delegate的BeginInvoke和EndInvoke

    什么是.net的异步机制呢? 解释这个话题之前,先让我们来看看同步执行的程序 https://github.com/chucklu/Test/blob/master/DotNet4.5开发指南/并行处 ...

  8. Elasticsearch之中文分词器插件es-ik(博主推荐)

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  9. [SpringBoot] - 配置文件的多种形式及优先级

              学习两个注解: @PropertySource   @ImportResource  ↓   @ConfigurationProperties  与 @Bean 结合为属性赋值 与 ...

  10. 测试工程师 技能要求:java编程,数据库,linux操作系统,自动化测试开发,性能测试,安全测试

    1.具有开发和测试经验,能负责带领大型项目测试 2.掌握或熟悉java编程,熟悉mysql,oracle等db,memcache,nosql等,有互联网行业从业经验 3.可撰写自动化测试工具以及搭建自 ...