educational codeforces 难度,codeforces round 712

  educational codeforces 难度,codeforces round 712

  教育密码部队第九轮e。商店里的小偷_博客_教育合力难度

  【题目链接】点击打开链接

  【题意】给定不,不,不种物品每种的价值为Ai,必须装满K个物品的背包,求所有能装的价值,从小到大输出。

  【解题方法】其实就是长度为1000的价值向量的k次幂,存在该价值就为1,否则为0。然后用快速傅里叶转换(同快速傅立叶变换)求K维卷积,用弯曲件数组可以降低精度误差,同时长度不要直接设为1e6。

  【复杂度分析】O(W*logW*logK)

  【交流代码】

  //

  //由BLUEBUFF 2016年1月10日创建

  //版权所有(c) 2016年BLUEBUFF .版权所有

  //

  #杂注注释(链接器,/STACK:102400000,102400000 )

  #包含ext/Pb _ ds/assoc _容器. hpp

  #包含ext/pb_ds/tree_policy.hpp

  #包含ext/pb_ds/hash_policy.hpp

  #包含集

  #包含地图

  #包括队列

  #包括堆栈

  #包含数学函数

  #包括cstdio

  #包含时间。h

  #包含标准库函数

  #包括字符串

  #包含复杂

  # include sstream//是字符串流

  #包括输入输出流

  #包含算法

  使用命名空间标准

  //使用命名空间_ _ gnu _ pbds

  typedef long long LL

  数据类型说明对int,LL pp

  #定义REP1(i,a,b)for(int I=a;我我)

  #定义REP2(i,a,b)for(int I=a;我我)

  #定义REP3(i,a,b)for(int I=a;我我-)

  #定义CLR(a,b) memset(a,b,sizeof(a))

  #定义MP(x,y) make_pair(x,y)

  模板类T1,类T2内联void getmax(T1 a,T2 b){ if(b a)a=b;}

  模板类T1,类T2内联void getmin(T1 a,T2 b){ if(b a)a=b;}

  const int maxn=(1 ^ 21)10;

  const int maxm=100010

  const int maxs=10

  const int maxp=1e3 10

  const int INF=1e9

  const int UNF=-1e 9;

  const int mod=1e 9 7;

  const double PI=acos(-1);

  //头

  数据类型说明复杂双复杂;

  void rader(Complex *y,int len) {

  for(int i=1,j=len/2;I len-1;i ) {

  if(i j) swap(y[i],y[j]);

  int k=len/2;

  while(j=k){ j-=k;k/=2;}

  if(j k)j=k;

  }

  }

  无效fft(复数*y,整数长度,整数运算){

  rader(y,len);

  for(int h=2;h=lenh=1) {

  double ang=op * 2 * PI/h;

  复数wn(cos(ang),sin(ang));

  for(int j=0;j lenj=h) {

  复数w(1,0);

  for(int k=j;k j h/2;k ) {

  复数u=y[k];

  复数t=w * y[k h/2];

  y[k]=u t;

  y[k h/2]=u-t;

  w=w * wn

  }

  }

  }

  if(op==-1)for(int I=0;我lenI)y[I]/=len;

  }

  int n,m,k;

  复数x1[maxn],x2[maxn];

  bool p[maxn],q[maxn];

  void multiply(bool *p,int n,bool *q,int m){

  int len=1;

  而(len=n m)len=1;

  for(int I=0;我leni ) x1[i]=复数(i=n?p[i] : 0,0);

  for(int I=0;我leni ) x2[i]=复数(i=m?q[i] : 0,0);

  fft(x1,len,1);

  fft(x2,len,1);

  for(int I=0;我lenI)x1[I]=x1[I]* x2[I];

  fft(x1,len,-1);

  for(int I=0;I=n m;i ) p[i]=x1[i].实()0.5;

  n=m;

  }

  int main()

  {

  scanf(%d%d ,n,k);

  for(int I=1;I=n;i ){

  int x;

  scanf(%d ,x);

  q[x]=1;

  }

  m=1000

  n=0;

  p[0]=1;

  当(k)

  {

  如果(国王^ 1)乘以(p,n,q,m);

  如果(国王^ 1)乘以(q,m,q,m);

  k=1;

  }

  for(int I=1;I=n;i ) if(p[i]) printf(%d ,I);printf( \ n );

  返回0;

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: