博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3771: Triple【生成函数+FFT+容斥原理】
阅读量:5014 次
发布时间:2019-06-12

本文共 1243 字,大约阅读时间需要 4 分钟。

瞎搞居然1A,真是吃鲸

n的范围只有聪明人能看见……建议读题3遍
首先看计数就想到生成函数,列出多项式A(x),然后分别考虑123
对于选一个的直接计数即可;
对于选两个的,\( A(x)^2 \),然后注意这里两个选一样的是不合法的,各出现了一次,所以减掉,然后这里是有顺序的,所以最后再除以2(就是(1,2)和(2,1)算两次);
对于选三个的,\( A(x)^3 \),然后去掉不合法的,设D(x)为每个斧头选两次的生成函数(也就是价格*2),然后A(x)*D(x)就表示前两个斧头重复选取的方案,注意是前两个,然后类似的情况还有后两个斧头重复选取的方案,第一个第三个斧头重复选取的方案,所以每一项*3,答案减掉这个多项式,然后发现三个斧头都选一样的情况各被算了三遍,所以再加上即可

#include
#include
#include
using namespace std;const int N=500005;int n,m,lm,bt,ans[N],re[N],x[N],q[N];struct cd{ double a,b; cd(double A=0,double B=0) { a=A,b=B; } cd operator + (const cd &x) const { return cd(a+x.a,b+x.b); } cd operator - (const cd &x) const { return cd(a-x.a,b-x.b); } cd operator * (const cd &x) const { return cd(a*x.a-b*x.b,a*x.b+b*x.a); }}a[N],b[N],c[N],d[N],e[N];int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}void dft(cd a[],int f){ for(int i=0;i
>1]>>1)|((i&1)<<(bt-1)); fft(a,b); for(int i=0;i

转载于:https://www.cnblogs.com/lokiii/p/10029324.html

你可能感兴趣的文章
UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
查看>>
FileUpload1.PostedFile.FileName 获取的文件名
查看>>
Mock InjectMocks ( @Mock 和 @InjectMocks )区别
查看>>
如何获取免版权图片资源
查看>>
MySql避免全表扫描【转】
查看>>
Storm学习笔记二
查看>>
windows 中的类似于sudo的命令(在cmd中以另一个用户的身份运行命令)
查看>>
java===单类设计模式之饿汉式与懒汉式
查看>>
BZOJ 1083: [SCOI2005]繁忙的都市
查看>>
Maven 编译
查看>>
《学习之道》第十章学习方法29还记得散步的好处嘛
查看>>
Git常用命令总结
查看>>
iOS获取设备IP地址
查看>>
JavaSE| String常用方法
查看>>
NRF51822配对绑定要点
查看>>
C语言博客作业—数据类型
查看>>
angularjs学习笔记
查看>>
Runtime.getRuntime().exec()需要注意的地方
查看>>
context.Response.ContentType类型列表
查看>>
logging和json
查看>>