枚举/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)$

  1. //UOJ Round #1 A
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<iostream>
  7. #include<algorithm>
  8. #define rep(i,n) for(int i=0;i<n;++i)
  9. #define F(i,j,n) for(int i=j;i<=n;++i)
  10. #define D(i,j,n) for(int i=j;i>=n;--i)
  11. #define pb push_back
  12. using namespace std;
  13. inline int getint(){
  14. int v=,sign=; char ch=getchar();
  15. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  16. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  17. return v*sign;
  18. }
  19. const int N=1e6+,INF=~0u>>;
  20. typedef long long LL;
  21. /******************tamplate*********************/
  22.  
  23. int a[N],c[N],n;
  24. int main(){
  25. #ifndef ONLINE_JUDGE
  26. freopen("A.in","r",stdin);
  27. freopen("A.out","w",stdout);
  28. #endif
  29. n=getint();
  30. LL sum=,ans=;
  31. int mx=;
  32. F(i,,n) a[i]=getint(),c[a[i]]++,sum+=a[i],mx=max(mx,a[i]);
  33. D(i,mx,) c[i]+=c[i+];
  34.  
  35. F(x,,mx){
  36. LL tmp=; int i;
  37. for(i=;(i+)*x<=mx;i++)
  38. tmp+=(c[i*x]-c[(i+)*x])*i;
  39. tmp+=c[i*x]*i;
  40. ans=max(ans,tmp*(x-));
  41. }
  42. printf("%lld\n",sum-ans);
  43. return ;
  44. }

外星人

  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$的外星人个数。

  1. //UOJ Round #1 B
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<iostream>
  7. #include<algorithm>
  8. #define rep(i,n) for(int i=0;i<n;++i)
  9. #define F(i,j,n) for(int i=j;i<=n;++i)
  10. #define D(i,j,n) for(int i=j;i>=n;--i)
  11. #define pb push_back
  12. using namespace std;
  13. inline int getint(){
  14. int v=,sign=; char ch=getchar();
  15. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  16. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  17. return v*sign;
  18. }
  19. const int N=,INF=~0u>>,P=;
  20. typedef long long LL;
  21. /******************tamplate*********************/
  22.  
  23. int n,m,a[N],c[N],f[N][],fac[N],inv[N];
  24. int main(){
  25. #ifndef ONLINE_JUDGE
  26. freopen("B.in","r",stdin);
  27. freopen("B.out","w",stdout);
  28. #endif
  29. n=getint(); m=getint();
  30. int mx=m;
  31. F(i,,n) a[i]=getint(),c[a[i]]++,mx=max(mx,a[i]);
  32. sort(a+,a+n+);
  33. F(i,,mx) c[i]+=c[i-];
  34.  
  35. fac[]=;
  36. F(i,,mx) fac[i]=(LL)fac[i-]*i%P;
  37. inv[]=inv[]=;
  38. F(i,,mx) inv[i]=P-(LL)(P/i)*inv[P%i]%P;
  39. F(i,,mx) inv[i]=(LL)inv[i]*inv[i-]%P;
  40.  
  41. F(i,,m){
  42. if (c[i]==) {f[i][]=i,f[i][]=;continue;}
  43. for(int j=;a[j]<=i && j<=n;j++)
  44. if (f[i%a[j]][]>f[i][]){
  45. f[i][]=f[i%a[j]][];
  46. f[i][]=(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P;
  47. }else if (f[i%a[j]][]==f[i][]){
  48. f[i][]=(f[i][]+(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P)%P;
  49. }
  50. }
  51. f[m][]=(LL)f[m][]*fac[c[mx]]%P*inv[c[m]]%P;
  52. printf("%d\n%d\n",f[m][],f[m][]);
  53. return ;
  54. }

【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. 001.etcd简介及单节点使用

    一 etcd简介 1.1 概述 etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key- ...

  2. 001.Parted工具使用

    一 Parted简介 1.1 parted和fdisk 通常使用较多的磁盘管理工具为fdisk,但由于磁盘越来越廉价,且磁盘空间越来越大,而fdisk工具分区存在大小限制,只能划分小于2T的磁盘.因此 ...

  3. 移动端二三事【三】:transform的矩阵(matrix)操作、transform操作函数及注意事项

    *每当在DOM浏览器中增加动态效果时,使用强大的transform和transition,总是很酸爽.抛开css,使用js操作transform还真的有点复杂,涉及到线性代数中的矩阵,但是js操作又不 ...

  4. ubuntu下安装flash player,浏览器观看视频,本人ubuntu版本14.04

    首先去官网下载flash player安装包:flash_player_npapi_linux.x86_64,下载地址:https://get.adobe.com/cn/flashplayer/ 解压 ...

  5. ViewPager 无限循环

    Overview 我们在使用ViewPager来制作图片轮播的时候,常常为ViewPager不能一直无限循环的问题所苦恼.对于这个问题,目前从网上找到了两个思路来解决: 将 ViewPager 的Co ...

  6. mysql索引原理剖析

    一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...

  7. [HDU4123]Bob’s Race

    题目大意:给定一棵$n$个点并且有边权的树,每个点的权值为该点能走的最远长度,并输入$m$个询问,每次询问最多有多少个编号连续的点,他们的最大最小点权差小于等于$Q$. 思路:两趟DP(DFS)求出每 ...

  8. BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT

    题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...

  9. SGU 200. Cracking RSA (高斯消元求自由变元个数)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=200 200. Cracking RSA time limit per test: ...

  10. JTAG TAP Controller

    The TAP controller is a synchronous finite state machine that responds to changes at the TMS and TCK ...