UOJ22. 【UR #1】外星人【DP】【思维】
题目大意
给你一个序列和一个值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】【思维】的更多相关文章
- UOJ22 UR #1外星人(动态规划)
https://www.cnblogs.com/Gloid/p/10629779.html 这一场的D. #include<bits/stdc++.h> using namespace s ...
- 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 ...
- cf1153D 树形dp+思维
一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...
- E. The Contest ( 简单DP || 思维 + 贪心)
传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- codeforces 1140D(区间dp/思维题)
D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- POJ 1390 Blocks(DP + 思维)题解
题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...
- “玲珑杯”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 官方题解: 代码如 ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
随机推荐
- JDBC连接数据库(一)
原文地址http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步 ...
- java-Unsupported major.minor version 52.0错误解决
java-Unsupported major.minor version 52.0错误解决 eclipse版本设置不对, 低版本不能兼容高版本 eclipse中: windows -> pref ...
- web前端几个小知识点笔记
1.css实现宽度是百分比的盒子为正方形 <div style="width:50%;padding-bottom:50%;height:0px;background:#ccc;&qu ...
- (5)调度器(scheduler)
继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止 ...
- cocos代码研究(9)ProgressTimer类学习笔记
理论部分 ProgressTimer是Node的子类. 该类根据百分比来渲染显示内部的Sprite对象. 变化方向包括径向,水平或者垂直方向. 代码部分 Type getType () const获取 ...
- Keras实践:模型可视化
Keras实践:模型可视化 安装Graphviz 官方网址为:http://www.graphviz.org/.我使用的是mac系统,所以我分享一下我使用时遇到的坑. Mac安装时在终端中执行: br ...
- window 下相关命令
1. 启动window服务(各种应用启动设置的地方)命令方式: 1). window 按钮(输入CMD的地方)处输入:services.msc ,然后执行. // 输入命令正确,上面的待选框中会出 ...
- 20145315 《Java程序设计》第三周学习总结
20145315 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 4.1类与对象 4.1.1定义类: new clothes():新建一个对象. class clothes ...
- Java多线程,线程交替执行
两个线程,一个打印1-100的奇数,一个打印1-100的偶数:要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环. Code: package com.qhong ...
- Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同
算法分析:这道题很简单,利用递归即可. public class SameTree { public boolean isSameTree(TreeNode p, TreeNode q) { if(p ...