3771: Triple

链接

题意

  n个斧头,每个斧头的价值都不同(开始时没注意到),可以取1个,2个,3个斧头组成不同的价值,求每种价值有多少种组成方案(顺序不同算一种)

分析:

  生成函数 + 容斥原理 + FFT。

  首先对于只取一个的话,那么生成函数就是$A = (x^0 + x^{w_1} + x^{w_2} + x^{w_3}+...+x^{w_n})$(指数为价值,系数为方案数)

  那么朴素的求解就是$ans = A+A^2+A^3$

  但是顺序不同算一种,所以每一项都除以n!,$ans = \frac{A}{1!}+\frac{A^2}{2!}+\frac{A^3}{3!}$。例如题面中的(a,b)和(b,a)是一样的。

  但是这还有一个问题,每把斧头只能拿一次。所以需要减去拿了多次的情况。构造两个分别为一个斧头拿两次,一个斧头拿三次的生成函数,$B = (x^0 + x^{2w_1} + x^{2w_2}+x^{2w_3}+...+x^{2w_n})$ ,$C = (x^0 + x^{3w_1} + x^{3w_2}+x^{3w_3}+...+x^{3w_n})$。

  考虑拿两把斧头的方案,减去一把斧头拿了两次的情况,即$\frac{A^2-B}{2}$。

  再考虑拿三把斧头的方案,首先减去一个斧头至少拿两次的方案$A∗B$,一个斧头拿两次的方案是会在被统计到三次,形如$(y,x,x),(x,y,x),(x,x,y)$,所以应该减去三次。一个斧头拿了两次的方案 包含了 拿了三次的方案,对于拿三次的方案,只会统计到一次,形如$(x,x,x)$,只减去一次就好了,所以在原式中再加回来两次,即$\frac{A^3-3*A*B+2*C}{3!}$。

  所以最后$ans=A+\frac{A^2-B}{2}+\frac{A^3-3*A*B+2*C}{6}$。

  参考博客https://www.zgz233.xyz/2017/08/06/bzoj-3771-triple/

代码:

 

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype> using namespace std; const int N = ;
const double Pi = acos(-1.0); struct Complex {
double x, y;
Complex() {}
Complex(double _x,double _y) {x = _x, y = _y;}
}A[N],B[N],C[N],ans[N]; Complex operator + (Complex a, Complex b) {
return Complex(a.x + b.x, a.y + b.y);
}
Complex operator - (Complex a, Complex b) {
return Complex(a.x - b.x, a.y - b.y);
}
Complex operator * (Complex a, Complex b) {
return Complex(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
} void FFT(Complex *a,int n,int ty) {
for (int i=,j=; i<n; ++i) {
if (i < j) swap(a[i],a[j]);
for (int k=n>>; (j^=k)<k; k>>=);
}
for (int m=; m<=n; m<<=) {
Complex w1 = Complex(cos(*Pi/m),ty*sin(*Pi/m));
for (int i=; i<n; i+=m) {
Complex w = Complex(,);
for (int k=; k<(m>>); ++k) {
Complex t = w * a[i+k+(m>>)];
Complex u = a[i+k];
a[i+k] = u + t;
a[i+k+(m>>)] = u - t;
w = w * w1;
}
}
}
} int main() {
int m,mx = ,n = ;
scanf("%d",&m);
for (int x,i=; i<=m; ++i) {
scanf("%d",&x);
A[x] = Complex(,);
B[x * ] = Complex(,);
C[x * ] = Complex(,);
if (x * > mx) mx = x * ;
}
while (n < mx) n <<= ; FFT(A,n,);
FFT(B,n,);
FFT(C,n,); Complex c2 = Complex(,),c3 = Complex(,),c6 = Complex(,);
Complex t1 = Complex(1.0/2.0,),t2 = Complex(1.0/6.0,); for (int i=; i<n; ++i)
ans[i] = A[i] +
(A[i] * A[i] - B[i]) * t1 +
(A[i] * A[i] * A[i] - (A[i] * B[i]) * c3 + C[i] * c2) * t2; FFT(ans,n,-); for (int i=; i<n; ++i) {
int Ans = (int)(ans[i].x / n + 0.5);
if (Ans) printf("%d %d\n",i,Ans);
} return ;
}

 

3771: Triple的更多相关文章

  1. 【BZOJ 3771】 3771: Triple (FFT+容斥)

    3771: Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 547  Solved: 307 Description 我们讲一个悲伤的故事. ...

  2. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  3. BZOJ 3771: Triple

    Description 问所有三/二/一元组可能形成的组合. Sol FFT. 利用生成函数直接FFT一下,然后就是计算,计算的时候简单的容斥一下. 任意三个-3*两个相同的+2*全部相同的+任意两个 ...

  4. 【BZOJ】3771: Triple

    http://www.lydsy.com/JudgeOnline/problem.php?id=3771 题意:n个带价值互不相同的物品,每次可以取1.2.3个物品,问能得到的所有的价值和这个价值的方 ...

  5. bzoj 3771 Triple FFT 生成函数+容斥

    Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Desc ...

  6. bzoj 3771 Triple——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自 ...

  7. bzoj 3771 Triple —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...

  8. BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]

    题意:n个物品,可以用1/2/3个不同的物品组成不同的价值,求每种价值有多少种方案(顺序不同算一种) [生成函数]: 构造这么一个多项式函数g(x),使得n次项系数为a[n]. 普通型生成函数用于解决 ...

  9. BZOJ 3771 Triple FFT+容斥原理

    解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...

随机推荐

  1. 【转】【MATLAB】模拟和数字低通滤波器的MATLAB实现

    原文地址:http://blog.sina.com.cn/s/blog_79ecf6980100vcrf.html 低通滤波器参数:Fs=8000,fp=2500,fs=3500,Rp=1dB,As= ...

  2. ssh配置解释

    http://vbird.dic.ksu.edu.tw/linux_server/0310telnetssh_2.php /etc/ssh/sshd_config Port 29922 #Addres ...

  3. C# 对XML操作-实例

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  4. vos语音业务规范操作承诺函

    语音业务规范操作承诺函 *****网络科技有限公司: 我司开通固话2000线,话务价格为0.045元/分钟(仅拨打中国移动网内电话).为防止投诉.网外电话.欠费等语音话务风险,我司承诺如下:在业务上遵 ...

  5. Node.js-sublime text3 配置node.js(ERROR: The process "node.exe" not found.)

    默认已经安装好sublime.node和npm 1.sublime的node.js插件下载 由于在package control上经常下载失败,所以这里直接从GitHub上进行下载! GitHub下载 ...

  6. API:什么是API?API与interface的区别

    我们都知道,API就是接口,那是什么鬼呢? 1.什么是API? api接口开发,其实和平时开发逻辑差不多:但是也有略微差异: 平时使用mvc开发网站的思路一般是都 由控制器 去 调用模型,模型返回数据 ...

  7. SAP S4CRM和C4C的技术比较

    如果您对SAP S/4HANA for Customer Management(以下简称S4CRM)和SAP Cloud for Customer(以下简称C4C)不甚熟悉,那我建议您可以先浏览我之前 ...

  8. Xcode 自定义控件创建及触发事件

    #pragma mark 控制器的view加载完毕的时候调用 //一般在这里进行界面的初始化 - (void)viewDidLoad { [super viewDidLoad]; NSLog(@&qu ...

  9. nodejs的一些概念

    上一节我们几乎是扫通http请求和响应的整个闭环,包括请求时候的头信息和服务器返回时候的头信息和状态码等等,这些在node的http中都能获取到,并且有相应都接口组装这些信息和返回它们,同时这些htt ...

  10. 将一个命令的输出保存到CSV文件

    执行段: 结果段: 补充:配合不同的命令可以使工作更加简单 使用Imort-Csv命令从文件中导入结构化数据