\[暑假集训CSP提高模拟 \operatorname{EIJ}_{2}(6)-1
\]

\(\operatorname{EIJ}_{k}(A)\) 定义为有 \(A\) 个球,\(k\) 个盒子,盒子相同,球不同,把全部球放入的方案数

Hint

易知 \(\operatorname{EIJ}_k(A)=\dfrac{A^k}{k!}\),详见 这篇文章

其实我觉得构造的过程更有意思:对一个给定的正整数 \(x\),找到一组 \((A.k)\),满足 \(x\times k!=A^{k}\)

我只简单 BrainStorm 了一组 \((6,2)\),实际上这个问题还是十分有趣的.

A.符号化方法初探

当序列全为正数时,构造方法是显然的:从左到右依次将每一个数加上前一个数,这样总是可以保证每一个数比上一个数大. 操作次数严格 \(n-1\)

当序列全为负数时同理,只不过对负数的加法相当于减法. 因此我们考虑从后向前依次将每一个数加上后一个数,这样总是可以保证每一个数比下一个数小. 操作次数也为严格 \(n-1\)

考虑到先找出一个绝对值最大的数,然后将序列里其他所有的数都加上该数. 假设此数是正的,则操作后数列中全为正数(若存在一个 \(x\lt 0\) 使得 \(x+\max\lt 0\),则有 \(\operatorname{abs}(x)\gt \operatorname{abs}(\max)\),与假设不成立). 同理,假设此数是负的,则操作后序列中全为负数. 按上述情况处理即可. 操作数严格 \(2n-2\)

  1. #include<bits/stdc++.h>
  2. //#include"test.h"
  3. #define int long long
  4. using namespace std;
  5. int n,a[200001];
  6. vector<pair<int,int>>cz;
  7. signed main(){
  8. // freopen("test.in","r",stdin);
  9. // freopen("test.out","w",stdout);
  10. scanf("%lld",&n);int maxn=0;int maxid=1;
  11. for(int i=1;i<=n;++i){
  12. scanf("%lld",&a[i]);
  13. if(abs(a[i])>abs(maxn)){
  14. maxn=a[i];
  15. maxid=i;
  16. }
  17. }
  18. for(int i=1;i<=n;++i){
  19. if(i!=maxid){
  20. cz.push_back({maxid,i});
  21. a[i]+=maxn;
  22. }
  23. }
  24. if(maxn>0){
  25. for(int i=1;i<=n-1;++i){
  26. cz.push_back({i,i+1});
  27. }
  28. }
  29. else{
  30. for(int i=n;i>=2;--i){
  31. cz.push_back({i,i-1});
  32. }
  33. }
  34. cout<<cz.size()<<endl;
  35. for(auto i:cz){
  36. cout<<i.first<<" "<<i.second<<endl;
  37. }
  38. // freopen("CON","w",stdout);
  39. // checker("test.in","test.out");
  40. }

放一份 test.h

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long aaa[1000001];
  4. int checker(char*in,char*out){
  5. ifstream f1,f2;
  6. f1.open(out);
  7. f2.open(in);
  8. int n,m;f2>>n;
  9. for(int i=1;i<=n;++i){
  10. f2>>aaa[i];
  11. }
  12. f1>>m;
  13. for(int i=1;i<=m;++i){
  14. int x,y;
  15. f1>>x>>y;
  16. aaa[y]+=aaa[x];
  17. }
  18. bool ac=true;
  19. for(int i=2;i<=n;++i){
  20. if(aaa[i]<aaa[i-1]){
  21. ac=false;
  22. cout<<"Wrong Answer On Place: "<<i-1<<","<<i<<endl;
  23. }
  24. }
  25. if(m>2*n){
  26. ac=false;
  27. cout<<"Too much operations:"<<m<<"(max is"<<2*n<<")"<<endl;
  28. }
  29. if(ac) cout<<"Accepted"<<endl;
  30. return ac;
  31. }

B.无标号 Sequence 构造

考虑到 \(A\times B\) 复杂度为 \(n^{3}\),在 \(t\le 10^{4}\) 的情况下一定跑不过去,考虑如何优化.

可以想到:矩阵乘法虽然没有 \(A\times B=C\rightarrow T\times A\times B=T\times C\),这样的规律,但是假如我们真的这样干了,出错概率好像不大. 将矩阵想象成高维向量,会发现只有向量点乘相等的那个球面里的矩阵会出现误判的情况,实在微乎其微. 因此我们考虑这样做.

再想到,假如 \(T\) 是一个 \((1,n)\) 的矩阵,乘起来之后,所有矩阵都变成 \((1,n)\) 的了,那么我们矩阵乘法的复杂度就会降低成 \(n^{2}\),可以通过此题.

实际上,出错的概率为 \(\frac{1}{p}\),可以多跑几遍拉正确率.

还有一种做法,即先乘一个 \((1,n)\) 的矩阵,再乘一个 \((n,1)\) 的矩阵,这样它就变成单点了,感觉意义不大.

我这一份洛谷过了,在题库上过不去,懒得调了.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. namespace hdk{
  4. namespace fastio{
  5. inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
  6. template<typename T>
  7. inline T read(T &A){A=read();return A;}
  8. #define ws(a) write(a);space()
  9. }
  10. }
  11. using namespace hdk::fastio;
  12. /* _MATRIX_H_ */
  13. const int mod=998244353;
  14. template<typename T,int maxlen>
  15. class matrix{
  16. private:
  17. int n,m;
  18. bool ifmod;
  19. T mat[maxlen+5][maxlen+5];
  20. public:
  21. inline T* operator[](int x){
  22. return mat[x];
  23. }
  24. inline void clear(){
  25. for(register int i=1;i<=n;++i){
  26. for(register int j=1;j<=m;++j){
  27. mat[i][j]&=0;
  28. }
  29. }
  30. n=0;
  31. m=0;
  32. ifmod=false;
  33. }
  34. inline void setmod(int x){
  35. if(x==0){
  36. ifmod=false;
  37. }
  38. else{
  39. ifmod=true;
  40. }
  41. }
  42. inline void resize(int nsize,int msize){
  43. n=nsize;
  44. m=msize;
  45. }
  46. inline void fill(int x){
  47. for(register int i=1;i<=n;++i){
  48. for(register int j=1;j<=m;++j){
  49. mat[i][j]=x;
  50. }
  51. }
  52. }
  53. inline void fill(std::vector<std::vector<T>> x){
  54. for(register int i=0;i<=(int)x.size()-1;++i){
  55. for(register int j=0;j<=(int)x[i].size()-1;++j){
  56. mat[i+1][j+1]=x[i][j];
  57. }
  58. }
  59. }
  60. inline void packed_clear(std::vector<std::vector<T>> x,int mod=0){
  61. resize(x.size(),x.front().size());
  62. fill(x);
  63. setmod(mod);
  64. }
  65. inline void packed_clear(int nsize,int msize,int filln=0,int mod=0){
  66. clear();
  67. resize(nsize,msize);
  68. setmod(mod);
  69. fill(filln);
  70. }
  71. inline void input(int nsize,int msize){
  72. n=nsize;
  73. m=msize;
  74. for(register int i=1;i<=n;++i){
  75. for(register int j=1;j<=m;++j){
  76. read(mat[i][j]);
  77. }
  78. }
  79. }
  80. inline matrix operator *(const matrix &A)const{
  81. matrix p;
  82. p.packed_clear(n,A.m,0,mod);
  83. for(register int i=1;i<=n;++i){
  84. for(register int j=1;j<=A.m;++j){
  85. for(register int k=1;k<=m;++k){
  86. p.mat[i][j]+=(1ll*mat[i][k]*A.mat[k][j])%mod;
  87. p.mat[i][j]%=mod;
  88. }
  89. }
  90. }
  91. return p;
  92. }
  93. inline bool operator ==(matrix<T,maxlen>A){
  94. for(register int i=1;i<=n;++i){
  95. for(register int j=1;j<=m;++j){
  96. if(mat[i][j]!=A[i][j]) return false;
  97. }
  98. }
  99. return true;
  100. }
  101. };
  102. /*--NAMESPACE HDK::MATRIX MATRIX_H_--*/
  103. matrix<int,3000> a,b,c,h,l;
  104. int main(){
  105. srand(time(0));
  106. int cases;read(cases);while(cases--){
  107. int n;read(n);
  108. h.resize(1,n);
  109. l.resize(n,1);
  110. for(int i=1;i<=n;++i){
  111. h[1][i]=rand();
  112. l[i][1]=rand();
  113. }
  114. a.input(n,n);b.input(n,n);c.input(n,n);
  115. if(h*a*b*l==h*c*l) printf("Yes\n");
  116. else printf("No\n");
  117. // a.clear();b.clear();c.clear();
  118. }
  119. }

D.有限制的构造

能想到这题是个背包,但是直接跑复杂度 \(nV^{2}\),显然 T

这个时候使用经典套路,互换值与值域,定义 \(f_{i,j,k}\) 表示考虑前 \(i\) 个,选了 \(j\) 个,第一个参数为 \(k\) 的第二参最小值,容易得到:

\[f_{i,j,k}=\min\begin{cases}f_{i-1,j,k}\\f_{i-1,j-1,k-a_{i}}+b_{i}\end{cases}
\]

初始化 \(f_{i,0,0}=0\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,x,y,td[81],xd[81],f[81][81][10001];
  4. int main(){
  5. scanf("%d %d %d",&n,&x,&y);
  6. for(int i=1;i<=n;++i){
  7. scanf("%d %d",&td[i],&xd[i]);
  8. }
  9. memset(f,0x3f,sizeof f);
  10. for(int i=0;i<=n;++i){
  11. f[i][0][0]=0;
  12. }
  13. for(int i=1;i<=n;++i){
  14. for(int j=1;j<=i;++j){
  15. for(int k=0;k<=x;++k){
  16. f[i][j][k]=f[i-1][j][k];
  17. if(k>=td[i]){
  18. f[i][j][k]=min(f[i][j][k],f[i-1][j-1][k-td[i]]+xd[i]);
  19. }
  20. }
  21. }
  22. }
  23. for(int i=n;i>=0;--i){
  24. // cout<<i<<": ";
  25. for(int j=0;j<=x;++j){
  26. // cout<<f[n][i][j]<<" ";
  27. if(f[n][i][j]<=y){
  28. cout<<min(i+1,n)<<endl;
  29. return 0;
  30. }
  31. }
  32. // cout<<endl;
  33. }
  34. }

暑假集训CSP提高模拟17的更多相关文章

  1. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  2. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  3. 20190820 Tue 集训总结&NOIP模拟 27

    低谷度过了? 但是skyh阿卡了,还是反衬出我的辣鸡. T1知道要sort,却忘了判重,正解不如暴力分高,555. T2成功化出正解柿子,然后化过头了,化出了无法DP的柿子. 果然不够强,大神们一眼就 ...

  4. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  5. 牛客网NOIP赛前集训营-提高组(第四场)B区间

    牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1  \dots   a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...

  6. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  7. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  8. NOIP模拟17.9.21

    NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...

  9. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  10. NOIP模拟 17.8.20

    NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...

随机推荐

  1. 搭建lnmp环境-nginx关联php-fpm (第三步)

    永久关闭防火墙sudo systemctl stop firewalldsudo systemctl disable firewall 有两个防火墙!如果上面那个关闭还不行,就继续关这个后重启.   ...

  2. 《Programming from the Ground Up》阅读笔记:p88-p94

    <Programming from the Ground Up>学习第5天,p88-p94总结,总计7页. 一.技术总结 1.touppercase.s #PURPOSE: This pr ...

  3. redis环境的安装

    Redis环境的安装(源码安装),主要分为单机安装与集群安装,无论是单机安装还是集群安装,Redis本身的依赖是必须要有的,本文所采用的Redis版本是redis-5.0.3,所需要的依赖如下: cp ...

  4. 世界机器人大会 —— 人形机器人(humanoid)、双足机器人、四足机器人 —— 我国最大的机器人展览会

    相关资料: https://www.bilibili.com/video/BV1iG411g7B4/ https://www.youtube.com/watch?v=8cJV08MTwA0 官网主页: ...

  5. 美国小伙: "American Guy: Only communism can save America!"

    视频地址: https://www.youtube.com/watch?v=Y_WQnXFh8ss 2024大选在即,又是拜登对阵特朗普的旧日重现.在角逐谁的对手反对者更多的畸形内耗中,有一个名为 M ...

  6. 论文《policy-gradient-methods-for-reinforcement-learning-with-function-approximation 》的阅读——强化学习中的策略梯度算法基本形式与部分证明

    最近组会汇报,由于前一阵听了中科院的教授讲解过这篇论文,于是想到以这篇论文为题做了学习汇报.论文<policy-gradient-methods-for-reinforcement-learni ...

  7. VSCode 如何将已编辑好的python文件中的 tab 键缩进转换成4个空格键缩进

    事情起源: 使用vscode维护一个7年前的python项目,发现编辑后运行报错,提示缩进错误,原因是当时的项目使用tab做缩进,而我正在用的vscode是使用4空格做缩进,因此造成了缩进不匹配的问题 ...

  8. 为什么被要求避免使用orcid

    前段时间收到了最高机构的通知,要求不要使用orcid,并对之前使用的情况进行自查.得到这个通知,我其实还是蛮无感的,毕竟我一篇论文也没法过,而且也没有用过这个orcid,虽然我自己也是有这个的. 关于 ...

  9. C# 导出表格时表头优化思路

    众所周知 众所周知,如果使用DataTable.一般的思路是这么写的 var exprotData = new DataTable("Datas"); exprotData.Col ...

  10. WhaleScheduler为银行业全信创环境打造统一调度管理平台解决方案

    项目背景 数字金融是数字经济的重要支撑和驱动力.近年来,我国针对数字金融的发展政策频频出台,<金融科技发展规划 (2022-2025年)>.<"十四五"数字经济发 ...