bzoj 3771: Triple 快速傅里叶变换 FFT-程序员宅基地

题目大意:

给出\(n\)个互不相同的物品,每个物品有价值\(x_i(x_i \leq 40000)\)如果可以从中取一个或两个或三个物品。问能够组合出来的所有价值和对应的方案数,全部输出.取值时,\((a,b)\)\((b,a)\)算作一种

题解:

不要说什没有给\(n\)的范围什么的,题目表明了\(n \leq 40000\)
我们首先想到的是直接取
我们构造出只取一个物品时的母函数
\[A(x) = x + x^2 + x^3 + ...\]
然后我们取两个物品的时候的母函数就可以用乘积来表示
\(A(x)*A(x)\)
但是我们发现这样取到了不合法的情况,每个物品只能取一遍,但是直接计算的话会出现同一个物品取了两次的情况
所以我们应该减去这个不合法的情况(即容斥原理)
什么是不合法情况呢?就是同一个物品被取到了两次.
所以我们构造出取同一个物品取了两次的母函数,即
\[B(x) = x^2 + x^4 + x^6 + ...\]
所以我们取两个的方案数就是\(A(x)^2 - B(x)\)
相应的我们构造出同一个物品取了三次的母函数,即
\[C(x) = x^3 + x^6 + x^9 + ...\]
所以我们考虑在取三个的时候我们取到的有\(AAB, ABA, BAA, AAA\)
所以由容斥原理,取三个的时候的方案即为\(A(x)^3 - 3A(x)B(x) + 2C(x)\)
但是我们都没有考虑顺序的问题,我们考虑顺去,除去所有元素的全排列
那么我们最终的答案就是
\[\frac{A(x)}{1!} + \frac{A(x)^2-B(x)}{2!} + \frac{A(x)^3 - 3A(x)B(x) + 2C(x)}{3!}\]
使用FFT计算即可

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
    x=0;char ch;bool flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 208000;
const double pi = acos(-1);
struct complex{
    double x,y;
    complex(){}
    complex(double a,double b){x=a;y=b;}
    complex operator + (const complex &r){return complex(x+r.x,y+r.y);}
    complex operator - (const complex &r){return complex(x-r.x,y-r.y);}
    complex operator * (const complex &r){return complex(x*r.x-y*r.y,x*r.y+y*r.x);}
    complex operator / (const double &r){return complex(x/r,y/r);}
};
void FFT(complex *x,int n,int p){
    for(int i=0,t=0;i<n;++i){
        if(i > t) swap(x[i],x[t]);
        for(int j=n>>1;(t^=j) < j;j>>=1);
    }
    for(int m=2;m<=n;m<<=1){
        complex wn(cos(p*2*pi/m),sin(p*2*pi/m));
        for(int i=0;i<n;i+=m){
            complex w(1,0),u;
            int k = m>>1;
            for(int j=0;j<k;++j,w=w*wn){
                u = x[i+j+k]*w;
                x[i+j+k] = x[i+j] - u;
                x[i+j] = x[i+j] + u;
            }
        }
    }
    if(p == -1) for(int i=0;i<n;++i) x[i] = x[i]/n;
}
complex a[maxn],b[maxn],c[maxn],d[maxn];
int main(){
    int n;read(n);
    int nn = 0;
    for(int i=0,x;i<n;++i){
        read(x);
        a[x].x += 1.0;
        b[x<<1].x += 1.0;
        c[x*3].x += 1.0;
        nn = cat_max(nn,x*3);
    }
    int len = 1;
    for(int i=1;(i>>1)<nn;i<<=1) len = i;
    FFT(a,len,1);FFT(b,len,1);
    for(int i=0;i<len;++i) d[i] = a[i]*a[i]*a[i]/6.0 + (a[i]*a[i] - a[i]*b[i] - b[i])/2.0 + a[i];
    FFT(d,len,-1);
    for(int i=0;i<len;++i) d[i] = d[i] + c[i]/3.0;
    for(int i=0;i<len;++i){
        int x = (int)(d[i].x + 0.5);
        if(x == 0) continue;
        printf("%d %d\n",i,x);
    }
    getchar();getchar();
    return 0;
}
  

转载于:https://www.cnblogs.com/Skyminer/p/6357342.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30470857/article/details/96058554

智能推荐

(学习笔记)PCL点云库的基本使用-程序员宅基地

文章浏览阅读1.1w次,点赞43次,收藏281次。点云是一种能够直观地表示和操作3D传感器所提供数据的方式,这类传感器包括深度摄像头和激光雷达。该类传感器在三维坐标参考系下对空间进行有限点集采样构成点云。通俗的来说,点云就是分布在三维空间的有限个点,这些点具体化的表示了三维传感器所采集到的数据,我们可以很容易的通过点云来查看空间中物体的位置。_pcl点云库

VMware Workstation部署最新版OpenWrt 23.05.3-程序员宅基地

文章浏览阅读846次,点赞24次,收藏30次。正文共:1456 字 51 图,预估阅读时间:2 分钟我们之前介绍了如何在VMware Workstation上安装OpenWrt(软路由是啥?OpenWrt又是啥?长啥样?在VMware装一个瞅瞅),也介绍了如何在VMware ESXi上部署OpenWrt(在ESXi上把OpenWrt变成真正的路由器)。如今,快3年过去了,OpenWrt版本又有了更新,我们一起来看看新版本有什么优化吧。Open..._vmware workstation最新

python 米家_米家设备通信协议-程序员宅基地

文章浏览阅读2.3k次。归纳来说总共是有五类设备,从无线连接协议上来分类的话:1、WiFi设备直接可接入米家App,如:各款小爱音箱、各类智能摄像头等2、Zigbee网关设备直接可通过WiFi接入米家App,同时是Zigbee设备的“父设备”,Zigbee设备通过Zigbee网关来接入米家App,如:米家多功能网关、米家空调伴侣(特别提醒,米家空调伴侣2不是Zigbee网关设备)、Aqara网关等3、蓝牙网关设备直接可通..._micropython接入米家

目前住院病人主要由护士护理这样做不仅需要大量护士而且由子不能随时观察危重病人的病情变化还可能会延误抢救时机.某医院打算开发-个以计算机为中心的患者监护系统试写出问题定义并且分析开发这个系统的可行性.-程序员宅基地

文章浏览阅读1.3k次。目前住院病人主要由护士护理这样做不仅需要大量护士而且由子不能随时观察危重病人的病情变化还可能会延误抢救时机.某医院打算开发-个以计算机为中心的患者监护系统试写出问题定义并且分析开发这个系统的可行性. 医院对患者监护系统的基本要求是随时接收每个病人的生理信号(脉搏、体温、血压、心电图等)定时记录病人情况以形成患者日志当某个病人的生理信号超出医生规定的安全范围时向值班护士发出警告信息,此外;护士在需要时还可以要求系统印出某个指定病人的病情报告.1、问题定义(1)本系统的数据源点是病人“和"护士",他们分别提

训练分类器为什么要用cross entropy loss(交叉熵损失函数)而不能用mean square error loss(MSE,最小平方差损失函数)?_为什么分类用交叉熵不用mae-程序员宅基地

文章浏览阅读1.3w次,点赞8次,收藏14次。在一个人工智能群里,有人问起,训练分类器为什么要用cross entropy loss(交叉熵损失函数)而不能用mean square error loss(MSE,最小平方差损失函数)呢?正好,在我的那本《深度学习之美》(第11章)提及这个问题,于是复制了一部分内容,作为回答,群里的同学觉得通俗易懂,于是,把我的回答贴到这里,算是一个总结:---------对于多分类的标签(即教师信号),从本质..._为什么分类用交叉熵不用mae

ChemDraw Professional for Mac 16.0.1.4 专业的生物化学绘图软件_chemdraw professional 16.0 mac秘钥-程序员宅基地

文章浏览阅读1.8k次。ChemDraw Professional for Mac 是化学家和生物学家选择的完整绘图工具,它们可以创建可用于ELN,数据库和出版物以及查询化学数据库(现已包括SciFinder)的可发布出版物的科学智能图纸。ChemDraw Professional for Mac 16.0.1.4 下载ChemDraw Professional for Mac安装激活方法:1、下载完成后双击“ChemDraw Professional.dmg”打开磁盘映像;2、拖动“ChemDraw Profe_chemdraw professional 16.0 mac秘钥

随便推点

京东面试真题解析,小白也能看明白_京东面试 r语言-程序员宅基地

文章浏览阅读127次。我的移动开发春季历程没有稳定的工作,只有稳定的能力。春天,又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的我,在经历了5年的脱发生涯后,现在更多的是称呼自己为移动开发攻城狮。正文面试总共花费30天左右,才拿到了offer。一面1.自我介绍2.项目3.四大组件4.activity生命周期5.启动模式6.线程状态7.网络协议(每一层、还有TCP和UDP)8.会不会网络编程9.handler10.JVM,内存模型那些11.GC(有哪些方法那种问题)1_京东面试 r语言

年后想跳槽涨薪?你想要的面试题全在这里-程序员宅基地

文章浏览阅读333次,点赞4次,收藏7次。这里我希望可以帮助到大家提升进阶。Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

PCL学习01之点云的基本操作_pcl导出点云-程序员宅基地

文章浏览阅读2.7k次。pcl读取,合并_pcl导出点云

集成钉钉机器人消息推送_batchsendotorequest发送图片-程序员宅基地

文章浏览阅读1k次,点赞22次,收藏22次。客户需要通过钉钉接收消息通知_batchsendotorequest发送图片

java&Springboot&mysql小区维修管理平台41866-计算机毕业设计项目选题推荐(附源码)-程序员宅基地

文章浏览阅读801次,点赞21次,收藏21次。小区维修管理平台从角色上划分为了社区用户、维修员、管理员三种角色。管理员用户角色:(1)登录:管理员的账号是在数据表表中直接设置生成的,不需要进行注册;(2)资源管理:当点击“资源管理”这一菜单的时候,会出新闻列表+新闻分类两个子菜单,可以对这两个模块进行增删改查操作;(3)系统用户:当点击“系统用户”这一菜单的时候,会出现管理员+社区用户+维修员这三个子菜单,可以对这三个模块进行增删改查操作;(4)交流管理:当点击“交流管理”这一菜单的时候,会出现留言板+留言分类这两个子菜单,可以对留言板进行增

适用于Yolo的IDEA调试技巧:不依赖命令行传入参数_python 不用命令行 传递从参数-程序员宅基地

文章浏览阅读240次。Pycham不用命令行传入参数_python 不用命令行 传递从参数

推荐文章

热门文章

相关标签