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

把方案作为系数、值作为指数,两项相乘就是系数相乘、指数相加,符合意义。

考虑去重。先自己卷积自己3次(就是求出点值表达式后a[ i ]=a[ i ]*a[ i ]*a[ i ],因为卷积3次就是点值的3次方,然后iDFT回去即可),这是无限制的然后把至少两个斧头相同的方案减去;刚才求的方案其实是有序的,所以两个斧头相同的话,第三个斧头有3个位置,要减去的是 a^2 * a 的3倍(a^2 * a即a的每一项的指数*2表示两个一样的斧头,然后和原来的a卷积);这时把三个斧头都一样的方案减掉了3次,一开始多算了1次,所以再加上一个a^3就行了。

再算一算一共2个斧头或一共1个斧头的即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define db double
  7. using namespace std;
  8. const int N=4e4+,M=N*; const db pi=acos(-);
  9. int n,m,w[N],len,r[M];
  10. db ans[M],an2[M],an1[M];
  11. struct cpl{db x,y;}a[M],b[M],I;
  12. cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
  13. cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
  14. cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
  15. int rdn()
  16. {
  17. int ret=;bool fx=;char ch=getchar();
  18. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  19. while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  20. return fx?ret:-ret;
  21. }
  22. int Mx(int a,int b){return a>b?a:b;}
  23. void fft(cpl *a,bool fx)
  24. {
  25. for(int i=;i<len;i++)
  26. if(i<r[i])swap(a[i],a[r[i]]);
  27. for(int R=;R<=len;R<<=)
  28. {
  29. int m=R>>;
  30. cpl Wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
  31. for(int i=;i<len;i+=R)
  32. {
  33. cpl w=I;
  34. for(int j=;j<m;j++,w=w*Wn)
  35. {
  36. cpl tmp=w*a[i+m+j];
  37. a[i+m+j]=a[i+j]-tmp;
  38. a[i+j]=a[i+j]+tmp;
  39. }
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. I.x=;
  46. n=rdn();for(int i=;i<=n;i++)w[i]=rdn(),m=Mx(m,w[i]);
  47. for(int i=;i<=n;i++)
  48. a[w[i]].x=;
  49. len=;
  50. for(;len<=m*;len<<=);
  51. for(int i=;i<len;i++)r[i]=(r[i>>]>>)+((i&)?len>>:);
  52. fft(a,);
  53. for(int i=;i<len;i++)a[i]=a[i]*a[i]*a[i];
  54. fft(a,);
  55. for(int i=;i<len;i++)ans[i]=a[i].x/len,a[i].x=a[i].y=;
  56.  
  57. for(int i=;i<=n;i++)
  58. a[w[i]<<].x=b[w[i]].x=;
  59. fft(a,); fft(b,);
  60. for(int i=;i<len;i++)a[i]=a[i]*b[i],b[i]=b[i]*b[i];
  61. fft(a,); fft(b,);
  62. for(int i=;i<len;i++)ans[i]-=a[i].x/len*,an2[i]=b[i].x/len;
  63.  
  64. for(int i=;i<=n;i++)ans[w[i]*]+=,an2[w[i]<<]-=,an1[w[i]]=;
  65. for(int i=;i<len;i++)
  66. {
  67. ans[i]=int(ans[i]/+an2[i]/+0.5)+an1[i];
  68. if(ans[i])printf("%d %d\n",i,(int)ans[i]);
  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 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...

  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. Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键

    概述  shell中常见命令history 历史纪录命令:history 命令格式如下: [root@localhost ~]# history [选项] [历史命令保存文件] -c:清空历史命令: ...

  2. 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!

    准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...

  3. freeswitch中集成使用ekho实现TTS功能一

    Linux下安装freeswitch并集成ekho实现TTS 1. linux下安装freeswitch就不多介绍了,具体链接网址: http://www.8000hz.com/archives/14 ...

  4. linux性能调分析及调优

    转:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及调优介绍 写在前面:计算机要解决的基本问题之一是 ...

  5. BFC与边距重叠详解

    1.什么是BFC? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位Box 是 CSS 布局的对象和基本单位, 直观点来说, ...

  6. 【Head First Servlets and JSP】笔记3:Servlet的生命周期

    1.servlet的存在就是要为客户服务.servlet的任务就是得到一个用户的请求,再发回一些响应. 请求可能很复杂,也可能很简单,例如,“为我的购物车结账”,这个请求携带了一些重要的数据,你必须知 ...

  7. 爬虫实例之使用requests和Beautifusoup爬取糗百热门用户信息

    这次主要用requests库和Beautifusoup库来实现对糗百的热门帖子的用户信息的收集,由于糗百的反爬虫不是很严格,也不需要先登录才能获取数据,所以较简单. 思路,先请求首页的热门帖子获得用户 ...

  8. Android电容屏(一)【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7820492 关键词:Android  电容屏 tp  ITO 平台信息:内核:linu ...

  9. 让FireFox支持 window.event 全局事件对象

    这里比原文稍加改进,让FF也支持 event.srcElement了, 省得每次写兼容代码挺麻烦的: //For firefox window.event if(typeof(window.event ...

  10. php记录代码执行时间

    $t1 = microtime(true); // ... 执行代码 ... $t2 = microtime(true); echo '耗时'.round($t2-$t1,3).'秒'; 简单说一下. ...