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

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

#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int bit[N];
const double PI=acos(-1);
struct cp {
double r, i;
cp(double _r=0, double _i=0) : r(_r), i(_i) {}
cp operator + (const cp &a) { return cp(r+a.r, i+a.i); }
cp operator - (const cp &a) { return cp(r-a.r, i-a.i); }
cp operator * (const cp &a) { return cp(r*a.r-i*a.i, r*a.i+i*a.r); }
};
void dft(cp *a, int n, int flag) {
for(int i=0; i<n; ++i) if(i<bit[i]) swap(a[i], a[bit[i]]);
for(int m=2; m<=n; m<<=1) {
cp wn(cos(PI*2.0/m), sin(PI*2.0/m)*flag);
int mid=m>>1;
for(int i=0; i<n; i+=m) {
cp w(1);
for(int j=0; j<mid; ++j) {
static cp u, v;
u=a[i+j], v=a[i+j+mid]*w;
a[i+j]=u+v;
a[i+j+mid]=u-v;
w=w*wn;
}
}
}
if(flag==-1) for(int i=0; i<n; ++i) a[i].r/=n;
}
void fft(int *A, int *B, int *C, int n) {
static cp a[N], b[N];
int len=1, bitl=-1;
for(; len<n; len<<=1, ++bitl);
for(int i=0; i<len; ++i) bit[i]=(bit[i>>1]>>1)|((i&1)<<bitl);
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;
dft(a, len, 1); dft(b, len, 1);
for(int i=0; i<len; ++i) b[i]=a[i]*b[i];
dft(b, len, -1);
for(int i=0; i<len; ++i) C[i]=b[i].r+0.5;
}
int a[N], b[N], c[N], t[N], ans[N], n, len;
void work() {
int l=n;
for(int i=0; i<l; ++i) ans[i]=a[i];
fft(a, a, t, n*2-1);
l=n*2-1;
for(int i=0; i<l; ++i) ans[i]+=(t[i]-b[i])>>1;
fft(a, t, t, n*3-2);
fft(a, b, a, n*3-2);
l=n*3-2;
for(int i=0; i<l; ++i) ans[i]+=(t[i]-3*a[i]+(c[i]<<1))/6;
}
int main() {
scanf("%d", &len);
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); }
work();
len=n*3-2;
for(int i=0; i<len; ++i) if(ans[i]) printf("%d %d\n", i, ans[i]);
return 0;
}

  

首先容易得到母函数$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. 【转载】PHP使用1个crontab管理多个crontab任务

    转载来自: http://www.cnblogs.com/showker/archive/2013/09/01/3294279.html http://www.binarytides.com/php- ...

  2. Memcached缓存在.Net 中的使用(memcacheddotnet)

    缓存对于提高大数据量的网站性能无疑不是一个很好的解决方案,针对缓存的使用网上同仁介绍很多,再次我仅仅分享一下自己对Memcached使用的简单介绍.Memchached的使用通过第三方DLL来完成,常 ...

  3. HDU1502 Regular Words

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:当只有两个数时,可以用卡特兰数做,当三个数时,没想到卡特兰数的做法.可以使用动态规划. 状态转 ...

  4. html5 简单音乐播放器

    html5 简单音乐播放器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...

  5. 网络模拟器WANem使用配置图文教程

    转自:http://blog.csdn.net/zm_21/article/details/25810263 WANem简介 由于公司在一些场合需要模拟真实的网络环境,如时延,丢包,抖动等,虽然使用L ...

  6. Unity3d 提示 "The scripts file name does not match the name of the class defined in the script!"的解决办法

    有两个原因,一个是文件的名称和类名不一致 第二个原因是有命名空间, 排除应该是可以修复的

  7. POJ 2114 Boatherds 树分治

    Boatherds     Description Boatherds Inc. is a sailing company operating in the country of Trabantust ...

  8. hdu 4770(枚举 + dfs爆搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 思路:由于最多只有15个".",可以直接枚举放置的位置,然后判断是否能够全部 ...

  9. Android的Touch事件处理机制

    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...

  10. SQLServer 维护脚本分享(09)相关文件读取

    /********************[读取跟踪文件(trc)]********************/ --查看事件类型描述 SELECT tc.name,te.trace_event_id, ...