from NOIP2016模拟题36

Description

商店里有n种背包和m种物品,物品体积为1到m,背包容积<=m

给出n个背包的容积

现在要求出这样一个物品集合,满足:

1)对于任意一个背包,都能找到这样一个物品的子集,使得这个子集中物品的体积和(每个物品可以使用多次)恰好等于背包的容积

2)对于每一个体积和小于等于m的物品子集(每个物品可以使用多次),都有一个背包容积恰好等于这个体积和

求满足条件的最少的物品集合

Analysis

有解 \(\Leftrightarrow\) 物品集=背包体积集合 时 有解

然后我们要缩小集合

就是判断一个数能不能被小于它的数背包dp出来

然而由于题目的特殊性质

只用是否存在两个小于它的数a,b满足a+b等于它

我们可以用FFT

简单证明:

若已经求出有解

a,b,c,d在物品集中

则2a,3a.....都在物品集中

同理a+b,2a+b,4a+2b+3c,2a+4b+5c+d什么的都在集合中

集合中的数任意两个相加即可表示任何数

证完了

回到一开始怎么知道物品集=背包集的情况是否满足条件?

将物品集conv后看看是否出现新数

有就不满足

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
const double pi=acos(-1.0);
const int M=1000007;
const int N=2097152; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n,m;
int rev[N];
struct CP{
double x,i;
CP(double xx=0.0,double ii=0.0){x=xx;i=ii;}
}a[N];
CP operator +(CP x,CP y){return CP(x.x+y.x,x.i+y.i);}
CP operator -(CP x,CP y){return CP(x.x-y.x,x.i-y.i);}
CP operator *(CP x,CP y){return CP(x.x*y.x-x.i*y.i,x.i*y.x+x.x*y.i);} void FFT(CP *a,int fl){
int i,j,k;
CP W,Wn,u,v;
for(i=0;i<N;i++) if(rev[i]<i) swap(a[i],a[rev[i]]); for(i=2;i<=N;i<<=1){
Wn=CP(cos(2*pi/i),fl*sin(2*pi/i));
for(j=0;j<N;j+=i){
W=CP(1,0);
for(k=j;k<j+i/2;k++,W=W*Wn){
u=a[k];
v=W*a[k+i/2];
a[k]=u+v;
a[k+i/2]=u-v;
}
}
} if(fl==-1)
for(i=0;i<N;i++) a[i].x=(a[i].x/N)+0.5;
} int vis[M];
int ans=0; int main(){
int i,j,k,x;
n=rd(),m=rd();
for(i=1;i<=n;i++){
x=rd();
vis[x]=1;
a[x]=CP(1,0);
} for(i=0;i<N;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(N>>1):0);
FFT(a,1);
for(i=0;i<N;i++) a[i]=a[i]*a[i];
FFT(a,-1); ans=n;
for(i=1;i<=m;i++)
if(a[i].x>=1){ //注意现在是double
if(!vis[i]){
puts("NO");
return 0;
}
ans--;
} puts("YES");
printf("%d\n",ans);
for(i=1;i<=m;i++)
if(vis[i]&&a[i].x<1){
if(ans>1) printf("%d ",i);
else printf("%d\n",i);
ans--;
}
return 0;
}

xsy 1836 - Shop的更多相关文章

  1. codeforces 632+ E. Thief in a Shop

    E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  2. Codeforces632E Thief in a Shop(NTT + 快速幂)

    题目 Source http://codeforces.com/contest/632/problem/E Description A thief made his way to a shop. As ...

  3. poj1157LITTLE SHOP OF FLOWERS

    Description You want to arrange the window of your flower shop in a most pleasant way. You have F bu ...

  4. Magicodes.Shop——版本历史

    Magicodes.Shop为湖南心莱信息科技有限公司(xin-lai.com)Magicodes系列产品之一. 产品中引用的Magicodes系列Nuget包的开源库地址为:https://gith ...

  5. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

  6. PHP Yii1.1.13(一):命令行创建应用~shop

    第一节 初始目录结构 (1)初识目录结构 在创建应用之前,我们来看一下Yii 1.x版本的目录结构:将yii-1.1.13安装文件解压到网站根目录下,打开framework目录,其目录如下图所示 (2 ...

  7. [POJ1157]LITTLE SHOP OF FLOWERS

    [POJ1157]LITTLE SHOP OF FLOWERS 试题描述 You want to arrange the window of your flower shop in a most pl ...

  8. LITTLE SHOP OF FLOWERS_DP

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20802   Accepted: 9613 Description You ...

  9. HDU 4884 TIANKENG’s rice shop (模拟)

    TIANKENG's rice shop 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/J Description TIANKE ...

随机推荐

  1. ReactiveCocoa概念解释进阶篇

    1.ReactiveCocoa常见操作方法介绍 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,因此只 ...

  2. 01创建线程CreateThread和_beginthreadex

    Windows多线程之线程创建 一. 线程创建函数 CreateThread 1. 函数原型 HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRI ...

  3. CSS基础(一)

    一.CSS概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表 ...

  4. python入门:1-99所有数的和附带等式

    #!/usr/bin/env python # -*- coding:utf-8 -*- #1-99所有数的和的等式 #start(开始,译音:思达二测)sum(合计,译音:桑木)temp(临时雇员, ...

  5. ASP( VBScript ) 解析 JSON

    <script language="jscript" runat="server"> Array.prototype.get = function( ...

  6. DeepFaceLab小白入门(3):软件使用!

    换脸程序执行步骤,大部分程序都是类似.DeepFaceLab 虽然没有可视化界面,但是将整个过程分成了8个步骤,每个步骤只需点击BAT文件即可执行.只要看着序号,一个个点过去就可以了,这样的操作应该不 ...

  7. 【windows】共享文件夹设置

    控制面板\网络和 Internet\网络和共享中心\高级共享设置 在当前的域\公用\家庭网络 下文件和打印机共享开关打开 现在可以在 计算机-网络 里面看到共享的计算机啦 选中自己想要分享的文件,右键 ...

  8. 使用Github第二节

    接着第一节我们注册完账号接下来我们要创建仓库 注:如果邮箱没收到邮件需要设置域名白名单! 1.设置QQ邮箱白名单 (1)打开QQ邮箱.点击[设置] (2)点击[反垃圾] (3)点击[设置域名白名单] ...

  9. Python9-hashilib模块-day28(大年初三)

    __getitem__\__setitem__\__delitem__ class Foo: def __init__(self,name,age,sex): self.name = name sel ...

  10. Ubuntu关机与重启的相关指令

    将数据同步写入到磁盘中的指令:sync 惯用的关机指令:shutdown 重新启动,关机:reboot,halt,poweroff shutdown可完成如下工作: 1.可以自由选择关机模式:是要关机 ...