http://www.lydsy.com/JudgeOnline/problem.php?id=3771

题意:n个带价值互不相同的物品,每次可以取1、2、3个物品,问能得到的所有的价值和这个价值的方案数(n不明(无意义= =),价值<=40000)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=200005;
  4. int bit[N];
  5. const double PI=acos(-1);
  6. struct cp {
  7. double r, i;
  8. cp(double _r=0, double _i=0) : r(_r), i(_i) {}
  9. cp operator + (const cp &a) { return cp(r+a.r, i+a.i); }
  10. cp operator - (const cp &a) { return cp(r-a.r, i-a.i); }
  11. cp operator * (const cp &a) { return cp(r*a.r-i*a.i, r*a.i+i*a.r); }
  12. };
  13. void dft(cp *a, int n, int flag) {
  14. for(int i=0; i<n; ++i) if(i<bit[i]) swap(a[i], a[bit[i]]);
  15. for(int m=2; m<=n; m<<=1) {
  16. cp wn(cos(PI*2.0/m), sin(PI*2.0/m)*flag);
  17. int mid=m>>1;
  18. for(int i=0; i<n; i+=m) {
  19. cp w(1);
  20. for(int j=0; j<mid; ++j) {
  21. static cp u, v;
  22. u=a[i+j], v=a[i+j+mid]*w;
  23. a[i+j]=u+v;
  24. a[i+j+mid]=u-v;
  25. w=w*wn;
  26. }
  27. }
  28. }
  29. if(flag==-1) for(int i=0; i<n; ++i) a[i].r/=n;
  30. }
  31. void fft(int *A, int *B, int *C, int n) {
  32. static cp a[N], b[N];
  33. int len=1, bitl=-1;
  34. for(; len<n; len<<=1, ++bitl);
  35. for(int i=0; i<len; ++i) bit[i]=(bit[i>>1]>>1)|((i&1)<<bitl);
  36. for(int i=0; i<len; ++i) a[i].r=A[i], a[i].i=0, b[i].r=B[i], b[i].i=0;
  37. dft(a, len, 1); dft(b, len, 1);
  38. for(int i=0; i<len; ++i) b[i]=a[i]*b[i];
  39. dft(b, len, -1);
  40. for(int i=0; i<len; ++i) C[i]=b[i].r+0.5;
  41. }
  42. int a[N], b[N], c[N], t[N], ans[N], n, len;
  43. void work() {
  44. int l=n;
  45. for(int i=0; i<l; ++i) ans[i]=a[i];
  46. fft(a, a, t, n*2-1);
  47. l=n*2-1;
  48. for(int i=0; i<l; ++i) ans[i]+=(t[i]-b[i])>>1;
  49. fft(a, t, t, n*3-2);
  50. fft(a, b, a, n*3-2);
  51. l=n*3-2;
  52. for(int i=0; i<l; ++i) ans[i]+=(t[i]-3*a[i]+(c[i]<<1))/6;
  53. }
  54. int main() {
  55. scanf("%d", &len);
  56. for(int i=0; i<len; ++i) { int x; scanf("%d", &x); a[x]=1; b[x*2]=1; c[x*3]=1; n=max(x+1, n); }
  57. work();
  58. len=n*3-2;
  59. for(int i=0; i<len; ++i) if(ans[i]) printf("%d %d\n", i, ans[i]);
  60. return 0;
  61. }

  

首先容易得到母函数$A=\sum_{存在价值为i的物品} x^i$

敲完了fft才发现如果直接求母函数的三次方是不对的= =...

妈呀竟然没想到容斥QAQ

设$B = \{A[i]^2\}, C = \{A[i]^3\}$

首先我们对取法分别求:

取1个的方案 $ = A$

取2个的方案 $ = \frac{A^2 - B}{A^{2}_{2}} = \frac{A^2 - B}{2}$

取3个的方案 $ = \frac{A^3 - \frac{3!}{2!1!} AB + \frac{3!}{2!1!} C - C}{A^{3}_{3}} = \frac{A^3 -3AB + 2C}{6}$

(看不懂的建议先去看《组合数学》= =)

然后fft搞搞就行辣= =

【BZOJ】3771: Triple的更多相关文章

  1. 【BZOJ】3771: Triple FTT+生成函数

    [题意]给定n个物品,价值为$a_i$,物品价格互不相同,求选一个或两个或三个的价值为x的方案数,输出所有存在的x和对应方案数.$ai<=40000$. [算法]生成函数+FFT [题解]要求价 ...

  2. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  3. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  4. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  5. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  6. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  7. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  8. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  9. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

随机推荐

  1. Android画面显示原理

    转自: http://blog.csdn.net/luoshengyang/article/details/7691321/ http://blog.chinaunix.net/uid-1675954 ...

  2. 【翻译四】java-并发之线程暂停

    Pausing Execution with Sleep Thread.sleep causes the current thread to suspend execution for a speci ...

  3. SOLR+LUCENE错误

    java.lang.NoClassDefFoundError: org/apache/lucene/analysis/synonym/SynonymFilter 该错误发生在自定义SOLR服务器时,原 ...

  4. JqueryEasyUI 解决IE下datagrid无法刷新的问题 分类: JavaScript JqueryEasyUI 2014-09-20 10:05 510人阅读 评论(1) 收藏

    问题描述: 在使用JqueryEasyUI 时,发现在IE下$('#table').datagrid('reload');无效,数据并没有被刷新,究其原因,是因为刷新时,datagrid请求的url没 ...

  5. VS2015 Preview Secondary Installer 离线安装

    VS2015 Preview Secondary Installer 离线安装 天朝的原因orz, 装过vs2015 preview 的人都懂的,第二阶段安装会失败.假公济私的研究了下VS2015,摸 ...

  6. android 入门-动画与容器

    set 动画容器 可作为资源id添加R.anim.xxxx   可用于在样式表中添加  http://blog.csdn.net/liuhe688/article/details/6660823 in ...

  7. js或jquery实现页面打印可局部打印

    方法一:直接用js的打印方法 <input id="btnPrint" type="button" value="打印" onclic ...

  8. hdu 2232 矩阵 ***

    一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...

  9. [SQL]查询及删除重复记录的SQL语句

    一:查询及删除重复记录的SQL语句1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...

  10. 让Web API支持$format参数的方法

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web AP ...