题目链接

BZOJ3771

题解

做水题放松一下

先构造\(A_i\)为\(x\)指数的生成函数\(A(x)\)

再构造\(2A_i\)为指数的生成函数\(B(x)\)

再构造\(3A_i\)为指数的生成函数\(C(x)\)

那么只需计算

\[A(x) + \frac{A^2(x) - B(x)}{2} + \frac{A^{3}(x) - 3(A(x)B(x) - C(x))}{6}
\]

那么\(x^i\)的系数即为损失价值\(i\)的方案数

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 800005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
const LL P = 2281701377ll,G = 3;
inline LL qpow(LL a,LL b){
LL re = 1;
for (; b; b >>= 1,a = a * a % P)
if (b & 1) re = re * a % P;
return re;
}
int R[maxn];
inline void NTT(LL* a,int n,int f){
for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);
for (int i = 1; i < n; i <<= 1){
LL gn = qpow(G,(P - 1) / (i << 1));
for (int j = 0; j < n; j += (i << 1)){
LL g = 1,x,y;
for (int k = 0; k < i; k++,g = g * gn % P){
x = a[j + k],y = g * a[j + k + i] % P;
a[j + k] = (x + y) % P,a[j + k + i] = ((x - y) % P + P) % P;
}
}
}
if (f == 1) return;
LL nv = qpow(n,P - 2); reverse(a + 1,a + n);
for (int i = 0; i < n; i++) a[i] = a[i] * nv % P;
}
LL A[maxn],B[maxn],C[maxn],D[maxn],ans[maxn],val[maxn],N,deg;
int main(){
N = read();
REP(i,N){
val[i] = read(),ans[val[i]]++;
A[val[i]] = 1; deg = max(deg,val[i]);
}
//2
int n = 1,m = deg << 1,L = 0;
while (n <= m) n <<= 1,L++;
for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
NTT(A,n,1);
for (int i = 0; i < n; i++) A[i] = A[i] * A[i] % P;
NTT(A,n,-1);
REP(i,N) A[val[i] << 1]--;
for (int i = 0; i < n; i++) ans[i] += A[i] >> 1; //3
REP(i,N) B[val[i]] = 1;
n = 1,m = deg * 3,L = 0;
while (n <= m) n <<= 1,L++;
for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
NTT(B,n,1);
for (int i = 0; i < n; i++) B[i] = B[i] * B[i] % P * B[i] % P;
NTT(B,n,-1); //2 + 1
REP(i,N) C[val[i] + val[i]] = 1,D[val[i]] = 1;
int nn = 1; L = 0,m = deg * 3;
while (nn <= m) nn <<= 1,L++;
for (int i = 1; i < nn; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
NTT(C,nn,1); NTT(D,nn,1);
for (int i = 0; i < nn; i++) C[i] = C[i] * D[i] % P;
NTT(C,nn,-1);
REP(i,N) C[val[i] * 3]--;
for (int i = 0; i < nn; i++) C[i] *= 3;
for (int i = 0; i < n; i++) B[i] -= C[i],B[i] /= 6,ans[i] += B[i]; for (int i = 0; i <= deg * 3; i++)
if (ans[i]) printf("%d %lld\n",i,ans[i]);
return 0;
}

BZOJ3771 Triple 【NTT + 容斥】的更多相关文章

  1. bzoj3771: Triple(容斥+生成函数+FFT)

    传送门 咳咳忘了容斥了-- 设\(A(x)\)为斧头的生成函数,其中第\(x^i\)项的系数为价值为\(i\)的斧头个数,那么\(A(x)+A^2(x)+A^3(x)\)就是答案(于是信心满满的打了一 ...

  2. 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)

    [题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...

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

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

  4. Codeforces 1553I - Stairs(分治 NTT+容斥)

    Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这道题放到 D1+D2 里作为 5250 分的 I 有点偏简单了吧 首先一件非常显然的事情是,如果我们已知了排列对应的阶梯序 ...

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

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

  6. 51nod 1514 美妙的序列 分治NTT + 容斥

    Code: #include<bits/stdc++.h> #define ll long long #define mod 998244353 #define maxn 400000 # ...

  7. 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]

    传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...

  8. HAOI 2018 染色(容斥+NTT)

    题意 https://loj.ac/problem/2527 思路 设 \(f(k)\) 为强制选择 \(k\) 个颜色出现 \(s\) 种,其余任取的方案数. 则有 \[ f(k)={m\choos ...

  9. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

随机推荐

  1. 小计Tomcat的调优思路

    描述 最近在补充自己的短板,刚好整理到Tomcat调优这块,基本上面试必问,于是就花了点时间去搜集一下tomcat调优 都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录, ...

  2. device_create与device_register

    //device_create的定义如下 struct device *device_create(struct class *class, struct device *parent, dev_t ...

  3. clean code(一)

    代码整洁之道对于程序的重构及可读性至关重要.开始整洁之道吧!!! 一.抽离try catch 模块 public void delete(Page page){ try { deletePageAnd ...

  4. appium+python自动化☞appium python api大全

    整理了一些常用的appium python api,供学习使用...

  5. 二、Django快速安装

    一.安装Python 作为一个Python Web框架,Django依赖Python.从Django适用于哪些版本的Python可以获取更多信息.较新版本的Python内置一个轻量级的数据库SQLit ...

  6. Hyperledger Fabric 1.1 -- Policy 构成

    Policy 规则设计 本文主要是讲解一下在fabric中Policy的规则和写法,让大家有一个初步的认识,本文是基于fabric 1.1版本 Policy Type Policy Type 目前包括 ...

  7. 【Python入门总结】

    用了两周时间将python的基本语法和模块过了一遍,alex的视频也简单看了下;并且在项目中直接上了python解析语义的实现,初步感觉到了python语言的魅力.下一步,会按照廖雪峰的python学 ...

  8. python中Requests模块中https请求在设置为忽略有效性验证,屏蔽告警信息的方式

    增加下面的就ok了from requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.ur ...

  9. Python中的构造函数

    Python中的构造函数是__init__函数.在Python中,子类如果定义了构造函数,而没有调用父类的,那么Python不会自动调用,也就是说父类的构造函数不会执行. 比如有test.py的mod ...

  10. 过山车 HDU 2063 (二分图匹配裸题)

    Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生 ...