题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771

令多项式的系数是方案数,次数是值;

设 a(x) 为一个物品的多项式,即 a[w[i]].x = 1,b(x) 为两个物品重复的多项式,即 b[w[i]*2].x = 1,c(x) 为三个物品重复的多项式,即 c[w[i]*3].x = 1;

选恰好三个有序物品的答案就是 a(x)^3 - 3*a(x)*b(x)^2 + c(x),因为要无序,所以再除以 3! = 6;

选恰好两个有序物品的答案就是 a(x)^2 - b(x),无序再除以 2! = 2;

再加上选一个物品的答案,也就是 c(x);

多项式也可以算乘方。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. typedef double db;
  8. int const xn=(<<);
  9. db const Pi=acos(-1.0);
  10. int n,rev[xn],lim,l,p[xn],p2[xn];
  11. db ans[xn];
  12. struct com{db x,y;}a[xn],b[xn],c[xn],t[xn];
  13. com operator + (com a,com b){return (com){a.x+b.x,a.y+b.y};}
  14. com operator - (com a,com b){return (com){a.x-b.x,a.y-b.y};}
  15. com operator * (com a,com b){return (com){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
  16. int rd()
  17. {
  18. int ret=,f=; char ch=getchar();
  19. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  20. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  21. return f?ret:-ret;
  22. }
  23. void fft(com *a,int tp)
  24. {
  25. for(int i=;i<lim;i++)
  26. if(i<rev[i])swap(a[i],a[rev[i]]);
  27. for(int mid=;mid<lim;mid<<=)
  28. {
  29. com wn=(com){cos(Pi/mid),tp*sin(Pi/mid)};
  30. for(int j=,len=(mid<<);j<lim;j+=len)
  31. {
  32. com w=(com){,};
  33. for(int k=;k<mid;k++,w=w*wn)
  34. {
  35. com x=a[j+k],y=w*a[j+mid+k];
  36. a[j+k]=x+y; a[j+mid+k]=x-y;
  37. }
  38. }
  39. }
  40. }
  41. int main()
  42. {
  43. n=rd(); int mx=;
  44. for(int i=,x;i<=n;i++)
  45. {
  46. x=rd(); a[x].x=b[x+x].x=c[x+x+x].x=;
  47. mx=max(mx,x); p[x]=p2[x+x]=;
  48. }
  49. lim=;
  50. while(lim<=*mx)lim<<=,l++;
  51. for(int i=;i<lim;i++)
  52. rev[i]=((rev[i>>]>>)|((i&)<<(l-)));
  53. fft(a,); fft(b,);
  54. for(int i=;i<lim;i++)t[i]=a[i]*a[i]*a[i];
  55. fft(t,-);
  56. for(int i=;i<lim;i++)ans[i]=t[i].x/lim;
  57. for(int i=;i<lim;i++)t[i]=a[i]*b[i];
  58. fft(t,-);
  59. for(int i=;i<lim;i++)ans[i]=(ans[i]-*(t[i].x/lim)+c[i].x)/;
  60.  
  61. for(int i=;i<lim;i++)t[i]=a[i]*a[i];
  62. fft(t,-);
  63. for(int i=;i<lim;i++)ans[i]=(ans[i]+(t[i].x/lim-p2[i])/);
  64. for(int i=;i<lim;i++)ans[i]+=p[i];
  65. for(int i=;i<lim;i++)
  66. {
  67. if((int)(ans[i]+0.5)==)continue;
  68. printf("%d %d\n",i,(int)(ans[i]+0.5));
  69. }
  70. return ;
  71. }

bzoj 3771 Triple —— FFT的更多相关文章

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

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

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

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

  3. bzoj 3771 Triple——FFT

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

  4. BZOJ 3771 Triple FFT+容斥原理

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

  5. BZOJ 3771 Triple ——FFT

    直接暴力卷积+统计就可以了. 去重比较复杂. 其实也不复杂,抄吧! 反正AC了. #include <map> #include <cmath> #include <qu ...

  6. BZOJ 3771: Triple(FFT+容斥)

    题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...

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

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

  8. BZOJ.3771.Triple(母函数 FFT 容斥)

    题目链接 \(Description\) 有\(n\)个物品(斧头),每个物品价值不同且只有一件,问取出一件.两件.三件物品,所有可能得到的价值和及其方案数.\((a,b),(b,a)\)算作一种方案 ...

  9. BZOJ 3771: Triple(生成函数 FFT)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 911  Solved: 528[Submit][Status][Discuss] Description ...

随机推荐

  1. Nutch学习笔记二——抓取过程简析

    在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...

  2. Why is chkconfig no longer available in Ubuntu?

    Question: I can not use chkconfig tools in Ubuntu 12.10 It's a very useful tools to configure the se ...

  3. jdk8之永久区Permanent区参数设置分析

    jdk8之永久区Permanent区参数设置分析 学习了:https://blog.csdn.net/wuhenzhangxing/article/details/78224905 jdk7中可以进行 ...

  4. 关于C语言中二维数组传參————————【Badboy】

    直接上代码: #include void Fun(int *a[],int m,int n)// { printf("%d\t",*a);//[0][0] /* int e[2][ ...

  5. Django进阶之Form

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.创建Form类 #!/usr/bin/en ...

  6. linux系列之-—04 自动删除n天前日志【转】

    让Linux系统定时清理一些不需要的文件,日志很有必要 1. 删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; ...

  7. 命令+mybatis-generator插件自己主动生成Mapper映射文件

    学mybatis的时候,自己写各种 *Mapper.xml和 *Mapper.java,注意各种sql语句中的 id 是否匹配.xml中的namespace是否正确,非常麻烦有木有?今天博客内容就是高 ...

  8. xadmin入门使用

    ,官方文档:http://xadmin.readthedocs.io/en/docs-chinese/views_api.html 中文文档:https://www.kancloud.cn/net_y ...

  9. 怎样高速编译mediatek\operator以下代码

    mediatek\operator以下有单独的apk.也有overlay的数据,单独的apk会配置anroid.mk,找到相应的路径直接build. 假设是overlay,则编译原来应用的路径,比如 ...

  10. eclipse的debug使用(转载)

    出处:http://www.blogjava.net/yxhxj2006/archive/2012/08/30/386621.html 远程Debug: http://blog.sina.com.cn ...