UOJ #22 UR #1 外星人
LINK:#22. UR #1 外星人
给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种?
n<=1000,x<=5000.
考虑一个排列真正的有效取模只有当 \(x\geq a_i\)时才行 所以x通过一个排列真正有效的数字必然是从大到小排列的。
求第一问 不难想到将模数从大到小排列 设f[i][j]表示到达第i个模数此时值为j是否可行。
这样dp下来我们只需要取出小于minn的那个可行值最大的即可。
考虑方案数 这样dp同样有效。
不过复杂度 \(n^2\cdot x\) 比较高。
考虑优化 不难发现对于f[i][j]来说 如果 j比\(a_{i-1}\)还要小 那么没有必要再把状态传到i-1了 直接让i-1在后面位置中随便选择一个位置即可。
设状态f[i]表示权值到达i的方案数.
此时只有<=i的模数才能优影响 且前面的所有模数已经被我们安排好位置了。
如果选择了一个模数 \(a_j\) 那么 设w=i%\(a_j\) 权值在i-1到w+1之间的模数便没用了随便排个位置即可。
复杂度\(nx\) 可以通过.(值得一提的是 最后能获得的最大值尽量用标记来判断 因为方案数要取模,(刚好模为0 就脸黑了.
const int MAXN=5010;
int n,m,minn;
int a[MAXN],vis[MAXN],b[MAXN];
ll f[MAXN],inv[MAXN],fac[MAXN];
inline ll ksm(ll b,int p){ll cnt=1;while(p){if(p&1)cnt=cnt*b%mod;b=b*b%mod;p=p>>1;}return cnt;}
inline void prepare()
{
fac[0]=1;
rep(1,n,i)fac[i]=fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);
fep(n-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);minn=INF;
rep(1,n,i)get(a[i]),minn=min(minn,a[i]),++vis[a[i]];
rep(1,m,i)vis[i]+=vis[i-1];
prepare();f[m]=fac[n]*inv[vis[m]]%mod;
sort(a+1,a+1+n);
fep(m,1,i)
{
if(!f[i])continue;
rep(1,n,j)
{
if(a[j]>i)break;
f[i%a[j]]=(f[i%a[j]]+f[i]*fac[vis[i]-1]%mod*inv[vis[i%a[j]]])%mod;
}
}
fep(minn-1,0,i)if(f[i]){printf("%d %lld\n",i,f[i]);return 0;}
}
UOJ #22 UR #1 外星人的更多相关文章
- 【UOJ#22】【UR #1】外星人(动态规划)
[UOJ#22][UR #1]外星人(动态规划) 题面 UOJ 题解 一道简单题? 不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的. 设\(f[i][j ...
- Uoj 22 外星人
Uoj 22 外星人 注意到一个数只有 \(\%\) 了小于等于自己的数时,才可能有变化,否则可以随意安排,不会对最后最优解造成影响. 用 \(f[x]\) 表示给一个数 \(x\) ,仅用 \(a[ ...
- 【UOJ#22】【UR#1】外星人
2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 n 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 1 到 n,其中 i 号外星人有 ...
- 【uoj#22】[UR #1]外星人 组合数学+dp
题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...
- UOJ#22. 【UR #1】外星人
传送门 分析 我们发现一个很神的性质,就是对于一个数如果放在它之前的数小于它那它一定对答案没有贡献 于是我们用dp[i][j]表示从大往小考虑了前i个数,当前答案是j的方案数 我们知道它由两种情况转移 ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- UOJ22 UR #1外星人(动态规划)
https://www.cnblogs.com/Gloid/p/10629779.html 这一场的D. #include<bits/stdc++.h> using namespace s ...
- UOJ.52.[UR #4]元旦激光炮(交互 思路)
题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...
- UOJ【UR #12】实验室外的攻防战
题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...
随机推荐
- 自适应高度输入框(contenteditable/textarea)
一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...
- 从此不怕Synchronized锁
Synchronized的使用 Synchronized是通过监视器保证线程同步从而保证线程安全.但是Synchronized锁可以锁对象和锁类,并会产生不同的效果,通过下面的案例彻底理解Sync ...
- Centos 6.4最小化安装后的优化(2)
1.关闭不必要的服务 众所周知,服务越少,系统占用的资源就会越少,所以应当关闭不需要的服务器.首先可以先看下系统中存在哪些已经开启了的服务.查看命令如下: ntsysv 下面列出的是需要启动的服务器, ...
- java 面向对象(三十八):反射(二) Class类的理解与获取Class的实例
1.Class类的理解 1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个 ...
- Mysql 实例:mysql语句练习50题(sqlalchmy写法)
为了练习sql语句,在网上找了一些题,自己做了一遍,收益颇多.很多地方换一种思路,有更好的写法,欢迎指正. 题目地址:https://blog.csdn.net/fashion2014/article ...
- 数据载入、存储及文件格式知识图谱-《利用Python进行数据分析》
所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片.
- javascript : 对象取值练习
let obj = { "qqq":0, "www":0, "eee":0, "rrr":1, "ttt&qu ...
- 3.新手建站教程系列之认识WordPress和第一篇文章
上一期咱已经把本地环境和wp网站给搭建出来了,接下来就是来认识这个程序了.进入网站后台,地址为你的网址/wp-admin 后台名字叫做仪表盘,首页是一个信息合集区域,上面会显示有多少文章,多少页面以及 ...
- python多进程之multiprocessing
什么是多进程? 简单的理解:单板上运行的一个程序就是一个进程.进程是操作系统分配资源的最小单位,不同的进程之间资源不共享,进程间通信需要使用特定的方式.python提供了自带的multiprocess ...
- python读取hdfs并返回dataframe教程
不多说,直接上代码 from hdfs import Client import pandas as pd HDFSHOST = "http://xxx:50070" FILENA ...