枚举/DP+排列组合


缩进优化

  QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$

  然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受……

  其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $

  也就是先将a[i]全部加起来,然后再使得被缩掉的部分最大。

  然后……枚举x,枚举x的倍数,数一下除以x为 i 的有多少个就可以了……$O(nlogn)$

 //UOJ Round #1 A
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e6+,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/ int a[N],c[N],n;
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
n=getint();
LL sum=,ans=;
int mx=;
F(i,,n) a[i]=getint(),c[a[i]]++,sum+=a[i],mx=max(mx,a[i]);
D(i,mx,) c[i]+=c[i+]; F(x,,mx){
LL tmp=; int i;
for(i=;(i+)*x<=mx;i++)
tmp+=(c[i*x]-c[(i+)*x])*i;
tmp+=c[i*x]*i;
ans=max(ans,tmp*(x-));
}
printf("%lld\n",sum-ans);
return ;
}

外星人

  Orz 题解

  我只想到如果 x<a[i] ,那么a[i]之后放到哪里都不会有影响了……

  对,我们只需要$f[i]$作为状态就够了。用$f[i]$表示$x=i$且只考虑手指数小于等于$i$的外星人的情况下的最优解与方案数。

  怎么转移呢?我们在手指数小于等于$i$的外星人中选一个$a_k$作为下一个发送信息的外星人,显然这个外星人一定是有效外星人。那么考虑手指数介于$(i\ mod\ a_k , i]$的外星人,我们发现只要把他们随便插入到$f[i \ mod\ a_k]$的最优解排列中去就可以了。这个显然可以用最简单的组合数学解决。方案数即$\frac{(N_i -1)!}{N_{i\ mod\ a_k}!}$。其中$N_c$表示手指数不超过$c$的外星人个数。

 //UOJ Round #1 B
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>,P=;
typedef long long LL;
/******************tamplate*********************/ int n,m,a[N],c[N],f[N][],fac[N],inv[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
n=getint(); m=getint();
int mx=m;
F(i,,n) a[i]=getint(),c[a[i]]++,mx=max(mx,a[i]);
sort(a+,a+n+);
F(i,,mx) c[i]+=c[i-]; fac[]=;
F(i,,mx) fac[i]=(LL)fac[i-]*i%P;
inv[]=inv[]=;
F(i,,mx) inv[i]=P-(LL)(P/i)*inv[P%i]%P;
F(i,,mx) inv[i]=(LL)inv[i]*inv[i-]%P; F(i,,m){
if (c[i]==) {f[i][]=i,f[i][]=;continue;}
for(int j=;a[j]<=i && j<=n;j++)
if (f[i%a[j]][]>f[i][]){
f[i][]=f[i%a[j]][];
f[i][]=(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P;
}else if (f[i%a[j]][]==f[i][]){
f[i][]=(f[i][]+(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P)%P;
}
}
f[m][]=(LL)f[m][]*fac[c[mx]]%P*inv[c[m]]%P;
printf("%d\n%d\n",f[m][],f[m][]);
return ;
}

【UOJ Round #1】的更多相关文章

  1. 【UOJ Round #5】

    构造+贪心/数论 为什么只有两个标题呢……因为第二题我不会…… 怎样提高智商 构造题……然而一开始半天我都yy不出来…… 后来我想:这题应该不会特别麻烦,而且既然样例只给了1,可能再给大一点就让人发现 ...

  2. 【UOJ Round #8】

    A 一道不错的题,虽然大家都觉得是水题,然而蒟蒻我想出来的好慢……Orz alpq 发现其实就是一个网格图,每一个大块都是同一颜色……横纵坐标互不干扰…… //UOJ Round #8 A #incl ...

  3. 【UOJ Round #3】

    枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...

  4. 【CS round 34】Minimize Max Diff

    [题目链接]:https://csacademy.com/contest/round-34/task/minimize-max-diff/ [题意] 给你n个数字; 数组按顺序不下降; 让你删掉k个数 ...

  5. 【CS Round 34】Max Or Subarray

    [题目链接]:https://csacademy.com/contest/round-34/summary/ [题意] 让你找一个最短的连续子串; 使得这个子串里面所有数字or起来最大; [题解] 对 ...

  6. UOJ #30【CF Round #278】Tourists

    求从$ x$走到$ y$的路径上可能经过的最小点权,带修改  UOJ #30 $ Solution:$ 如果两个点经过了某个连通分量,一定可以走到这个连通分量的最小值 直接构建圆方树,圆点存原点的点权 ...

  7. UOJ #30. 【CF Round #278】Tourists

    Description Cyberland 有 n 座城市,编号从 1 到 n,有 m 条双向道路连接这些城市.第 j 条路连接城市 aj 和 bj.每天,都有成千上万的游客来到 Cyberland ...

  8. 【57.97%】【codeforces Round #380A】Interview with Oleg

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. 【42.86%】【Codeforces Round #380D】Sea Battle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. 深入理解指针—>指针函数与函数指针的区别

    一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数, ...

  2. 自动添加 Qt 开发生成的 exe 所需的依赖环境

    双击获取 exe 文件路径 cd 进入文件目录的命令 调用 Qt 自带的软件进行环境配置,命令如下 windeployqt ***.exe 自动配置了依赖环境

  3. 无法在web服务器上启动调试,iis未列出与打开的URL匹配的网站

    错误的原因可能是:在iis的网站上绑定的具体的机器的ip地址. 解决方法:可以在网站上绑定ip地址时选择“全部未分配”项.

  4. div光标

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. [廖雪峰] Git 分支管理(1):创建与合并分支(HEAD、master、dev、指针)

    每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支.HEAD 严格来说不是指向提交,而是指向 mas ...

  6. kaleidoscope-llvm

    http://kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/latest/chapter-1.html

  7. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  8. .Net Discovery 系列之六--深入浅出.Net实时编译机制(下)

    接上文 在初始化时,HashTable中各个方法指向的并不是对应的内存入口地址,而是一个JIT预编译代理,这个函数负责将方法编译为本地代码.注意,这里JIT还没有进行编译,只是建立了方法表! 下表(表 ...

  9. C#编程(四十三)----------Lambda表达式

    Lambda表达式 案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  10. C#中的Hashtable

    richTextBox1.Text = ""; Hashtable ht = new Hashtable(); ht.Add("); ht.Add("); ht ...