HDU 4609 3-idiots(FFT)

3-idiots

思路

多项式卷积的经典应用了:

看样例一:

4
1 3 3 4

我们用多项式系数表示得到一个与aia_iai有关的多项式:010210\ 1\ 0\ 2\ 10 1 0 2 1

也就说明原序列有0个1,1个1,0个2,2个3,1个4,

这个多项式卷积之后得到:0 0 1 0 4 2 4 4 1

也就是可重复使用上面的两个数可以得到1个2…\dots

由此我们就确定了三角形的两条边了,但是因为可重复使用+有序,所以我们要对上面的数值做一点点改变。

for(int i = 1; i <= n; i++) {num[x[i] + x[i]]--;
}//去除重复使用
for(int i= 0; i < lim; i++) {num[i] >>= 1;
}//把序列变成有序状态

接下来就是找出合法的组合方案了。

我们枚举最大的边,把不合法的方案都给减去即可。

代码

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi = acos(-1.0);const int N = 1e6 + 10;struct Complex {double r, i;Complex(double _r = 0, double _i = 0) : r(_r), i(_i) {}}a[N];Complex operator + (const Complex & a, const Complex & b) {return Complex(a.r + b.r, a.i + b.i);
}Complex operator - (const Complex & a, const Complex & b) {return Complex(a.r - b.r, a.i - b.i);
}Complex operator * (const Complex & a, const Complex & b) {return Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}int r[N], x[N], n, m;ll num[N];void fft(Complex * f, int lim, int rev) {for(int i = 0; i < lim; i++) {if(r[i] < i) {swap(f[i], f[r[i]]);}}for(int i = 1; i < lim; i <<= 1) {Complex wn = Complex(cos(pi / i), rev * sin(pi / i));for(int p = i << 1, j = 0; j < lim; j += p) {Complex w = Complex(1, 0);for(int k = 0; k < i; k++, w = w * wn) {Complex x = f[j + k], y = w * f[i + j + k];f[j + k] = x + y, f[i + j + k] = x - y;}}}if(rev == -1) {for(int i = 0; i < lim; i++) {f[i].r /= lim;}}
}void get_r(int lim) {for(int i = 0; i < lim; ++i) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T, lim;scanf("%d", &T);while(T--) {scanf("%d", &n);memset(num, 0, sizeof num);for(int i = 1; i <= n; i++) {scanf("%d", &x[i]);num[x[i]]++;}sort(x + 1, x + 1 + n);lim = 1;while(lim <= (2 * x[n])) {lim <<= 1;}for(int i = 0; i <= x[n]; i++) {a[i] = Complex(num[i], 0);}for(int i = x[n] + 1; i < lim; i++) {a[i] = Complex(0, 0);}get_r(lim);fft(a, lim, 1);for(int i = 0; i < lim; i++) {a[i] = a[i] * a[i];}fft(a, lim, -1);for(int i = 0; i < lim; i++) {num[i] = int(a[i].r + 0.5);}for(int i = 1; i <= n; i++) {num[x[i] + x[i]]--;}for(int i= 0; i < lim; i++) {num[i] >>= 1;}ll tot = 1ll * n * (n - 1) * (n - 2) / 6, ans = tot;for(int i = 1, k = 1; i < lim; i++) {if(num[i]) {while(k <= n && i > x[k]) k++;if(k == n + 1) break;ans -= num[i] * (n - k + 1);}}printf("%.7f\n", 1.0 * ans / tot);}return 0;
}

C - Golf Bot(附赠裸题)

思路

多项式相乘一下,然后判断哪些值出现了,再记个数就行,FFT裸题。

代码

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi = acos(-1.0);const int N = 1e6 + 10;struct Complex {double r, i;Complex(double _r = 0, double _i = 0) : r(_r), i(_i) {}}a[N];Complex operator + (const Complex & a, const Complex & b) {return Complex(a.r + b.r, a.i + b.i);
}Complex operator - (const Complex & a, const Complex & b) {return Complex(a.r - b.r, a.i - b.i);
}Complex operator * (const Complex & a, const Complex & b) {return Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}int r[N], k[N], num[N], d[N], n, m, ans, lim;void fft(Complex * f, int lim, int rev) {for(int i = 0; i < lim; i++) {if(r[i] < i) {swap(f[i], f[r[i]]);}}for(int i = 1; i < lim; i <<= 1) {Complex wn = Complex(cos(pi / i), rev * sin(pi / i));for(int p = i << 1, j = 0; j < lim; j += p) {Complex w = Complex(1, 0);for(int k = 0; k < i; k++, w = w * wn) {Complex x = f[j + k], y = w * f[i + j + k];f[j + k] = x + y, f[i + j + k] = x - y;}}}if(rev == -1) {for(int i = 0; i < lim; i++) {a[i].r /= lim;}}
}void get_r(int lim) {for(int i = 0; i < lim; ++i) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &k[i]);num[k[i]]++;}sort(k + 1, k + 1 + n);lim = 1;while(lim < k[n] * 2) lim <<= 1;for(int i = 0; i < lim; i++) {a[i] = Complex(num[i], 0);}get_r(lim);fft(a, lim, 1);for(int i = 0; i < lim; i++) {a[i] = a[i] * a[i];}fft(a, lim, -1);for(int i = 0; i < lim; i++) {num[i] += int(a[i].r + 0.5);}scanf("%d", &m);for(int i = 1; i <= m; i++) {int x;scanf("%d", &x);if(num[x]) {num[x] = 0;ans++;}}printf("%d\n", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5488 差分与前缀和(多项式/生成函数)

P5488 差分与前缀和 对于这道题需要我们快速对一个数列求解前缀和和差分&#xff0c;那么我们利用生成函数的知识&#xff0c;就可以知道实际上等价于乘一个多项式&#xff0c;然后我们就有了一个ln和exp的方法&#xff0c;然后比较简短的方法就是将其利用广义二项式定理展开&…

2019-02-23-算法-进化

题目描述&#xff1a;给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1&#xff1a; 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2&#xff1a; 输入: "cbbd" 输…

Docker(二)-在Docker中部署Nginx实现负载均衡(视频)

一、前言在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中&#xff0c;我们将继续介绍利用Docker部署Nginx服务实现负载均衡&#xff0c;我们通过视频方式向大家进行演示。注&#xff1a;查看公众号历史文章&…

P4389 付公主的背包(生成函数/多项式)

P4389 付公主的背包 https://www.luogu.com.cn/problem/solution/P4389 经典生成函数问题 求解无限背包问题&#xff0c;我们可以将每个物品看作一个多项式&#xff0c;那么最后的结果就是这些多项式的卷积的系数&#xff0c;然后我们实际上就可以考虑分治NTT了&#xff0c;但…

HDU 6265 Master of Phi

Master of Phi 推式子 ∑d∣nϕ(nd)d给出了n的唯一分解形式我们先对上面式子进行化简通过组合枚举d&#xff0c;d的取值分别可以通过∏i1m∑j0qipij&#xff0c;一个多项式组合得到那么上述的式子有没有可能也通过这种新式得到呢&#xff0c;好像是可以的∑d∣nϕ(nd)d∏i1m∑…

Docker系列之镜像瘦身(五)

本节我们来讲讲在我们在构建镜像过程中不出问题&#xff0c;同时使得最后所构建的镜像文件大小尽可能最小。缓存(cache)Docker的优势之一在于提供了缓存&#xff0c;加速镜像迭代构建&#xff0c;我们知道构建镜像使用docker build命令&#xff0c;也就是说通过docker build的缓…

2019-02-24-算法-进化

题目描述 将一个给定字符串根据给定的行数&#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; L C I R E T O E S I I G E D H N之后&#xff0c;你的输出需要从左往右逐行读…

P5641 【CSGRound2】开拓者的卓识(多项式)

P5641 【CSGRound2】开拓者的卓识 https://www.luogu.com.cn/problem/solution/P5641 经典的讨论贡献的题目&#xff0c;如果一层一层展开就太暴力了&#xff0c;我们直接考虑每个数被计算了多少次&#xff0c;那么应该是它的左边放k-1个左括号&#xff0c;右边放k-1个右括号的…

2019-02-25-算法-进化

题目描述&#xff1a; 给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例1&#xff1a; 输入: 123 输出: 321示例2&#xff1a; 输入: -123 输出: -321示例3&#xff1a; 输入: 120 输出: 21我的解法&#xff1a; public int reverse(…

一张图了解.Net Core和.NetFx和.Net Standard和Xamarin关系

一张图了解.Net Core和.Net Framework和.Net Standard和Xamarin关系总结.NET Standard是一项API规范&#xff0c;每一个特定的版本&#xff0c;都定义了必须实现的基类库。.NET Core是一个托管框架&#xff0c;针对构建控制台、云、ASP.NET Core和UWP应用程序进行了优化。每一种…

Java修炼之路——基础篇——String

String 1&#xff1a;字符串的不可变性 什么是不可变对象&#xff1f;不可变对象是指创建后无法变更的对象 String为什么是不可变的&#xff1f;String类为final&#xff0c;并且内部字符数组也为final。所以String对象是不可变对象。 String类为什么要设计为不可变&#xff1…

P3338 [ZJOI2014]力(FFT)

P3338 [ZJOI2014]力 Fj∑i1j−1qiqj(i−j)2−∑ij1nqiqj(i−j)2Ej∑i1j−1qi(i−j)2−∑ij1nqi(i−j)2f(i)qi,g(i)1i2,f(0)0,g(0)0Ej∑i0jf(i)g(j−i)−∑ijnf(i)g(i−j)F_j \sum_{i 1} ^{j - 1} \frac{q_i \times q_j}{(i - j) ^ 2} - \sum_{i j 1} ^{n} \frac{q_i \times…

CF755G PolandBall and Many Other Balls(多项式/倍增fft)

CF755G PolandBall and Many Other Balls 倍增fft模版题 这种问题关键在于两个状态转移&#xff0c;一个是单点加1&#xff0c;还有一个是乘2&#xff0c;这样我们就相当于拥有了二进制下的左移操作和加1操作&#xff0c;那么可以在O(logn)的时间内表示出任何一个数。 然后对…

VS, VS Code, VS Online, VS xxx, 你都分清了吗?

首先说说部分童鞋容易混淆的 Visual Studio 和 Visual Studio Code 吧。其实&#xff0c;它们俩的关系&#xff0c;就相当于 Java 和 JavaScript&#xff0c;没啥关系。再说说 Visual Studio Online。这就复杂了。历史上&#xff0c;出现过两个 Visual Studio Online&#xff0…

Java修炼之路——基础篇——Java关键字

1&#xff1a;transient 当对象被序列化时&#xff0c;transient阻止其修饰的对象进行序列化&#xff1b;当反序列化时&#xff0c;此对象的值不会被恢复。 2&#xff1a;instanceof 判断引用指向的对象&#xff0c;是不是某个类及其子类的实例对象&#xff1b; class Person …

.NetCore从零开始使用Skywalking分布式追踪系统

将本文从0开始搭建两个webapi项目&#xff0c;使用Skywalking来追踪他们之间的调用关系及响应时间。开发环境为VisualStudio20191&#xff1a;安装Skywalking,可参考&#xff1a;https://www.cnblogs.com/sunyuliang/p/11422576.html&#xff0c;本列中搭建好后的Skywalking服务…

P3723 [AH2017/HNOI2017]礼物(FFT)

P3723 [AH2017/HNOI2017]礼物 式子化简 ∑i1n(xi−yj)2\sum_{i 1} ^{n} (x_i- y_j) ^2\\ i1∑n​(xi​−yj​)2 我们对第一个手环ccc&#xff0c;相当于(xic−yi)2(x_i c - y_i) ^ 2(xi​c−yi​)2&#xff0c;对第二个手环ccc相当于(xi−yi−c)2(x_i - y_i - c) ^2(xi​−…

CF623E Transforming Sequence(多项式/倍增fft/动态规划)

CF623E Transforming Sequence 经典的倍增NTT题目&#xff0c;但是由于万恶的模数导致这道题变成了倍增MTT 要求n个数前缀或严格递增的序列个数&#xff0c;一共有k位。 然后我们考虑进行dp&#xff0c;然后我的思路就是fi,jf_{i,j}fi,j​表示前i位在k位中有j位的方案数&…

2019-02-26-算法-进化(字符串转换成整数)

题目描述&#xff1a; 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xff0c;则将该符号与之后…

通过Service访问应用 (1)

目录通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作&#xff0c;应用部署完成了&#xff0c;我们的Demo网站已经成功启动了&#xff0c;那么如何访问网站呢&#xff1f;通过Pod IP访问应用我们可以通过Pod IP…