UVA12298 Super Poker II
怎么又是没人写题解的UVA好题,个人感觉应该是生成函数的大板子题了。
直接做肯定爆炸,考虑来一发优化,我们记一个多项式,其中\(i\)次项的系数就表示对于\(i\)这个数有多少种表示方式。
那么很明显,我们可以先筛素数,那么初始的多项式只有范围的的素数对应项系数才为\(1\),否则都为\(0\)。
然后考虑两种花色配对,其实就是看任意两张牌上面的数字加起来能得到什么。
说具体点就是配对后某个项的系数就是两种花色中项的次数之和为这个次数的所有系数之和。
所以我们发现配对的本质其实就是卷积,那么就可以用FFT优化之了。
注意这题有点卡精度,需要开一波long double才能过。
CODE
#include<cstdio>
#include<cctype>
#include<cmath>
#define RI register int
using namespace std;
typedef long double DB;
const DB pi=acos(-1);
const int N=50005;
struct Complex
{
DB x,y;
Complex(DB X=0,DB Y=0) { x=X; y=Y; }
}S[N<<3],H[N<<3],C[N<<3],D[N<<3]; int a,b,c,rev[N<<3],prime[N+5],cnt,lim=1,p,x; bool vis[N+5]; char opt;
inline Complex operator +(Complex A,Complex B) { return Complex(A.x+B.x,A.y+B.y); }
inline Complex operator -(Complex A,Complex B) { return Complex(A.x-B.x,A.y-B.y); }
inline Complex operator *(Complex A,Complex B) { return Complex(A.x*B.x-A.y*B.y,A.x*B.y+A.y*B.x); }
class FFT_Solver
{
private:
inline void swap(Complex &x,Complex &y)
{
Complex t=x; x=y; y=t;
}
public:
inline void init(int n)
{
lim=1; p=0; while (lim<=n) lim<<=1,++p; lim<<=2; p+=2;
for (RI i=0;i<lim;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<p-1);
}
inline void FFT(Complex *f,int opt)
{
RI i; for (i=0;i<lim;++i) if (i<rev[i]) swap(f[i],f[rev[i]]);
for (i=1;i<lim;i<<=1)
{
Complex D(cos(pi/i),opt*sin(pi/i));
int m=i<<1; for (RI j=0;j<lim;j+=m)
{
Complex W(1,0); for (RI k=0;k<i;++k,W=W*D)
{
Complex x=f[j+k],y=W*f[i+j+k];
f[j+k]=x+y; f[i+j+k]=x-y;
}
}
}
}
}F;
#define Pi prime[j]
inline void Euler(int n)
{
for (RI i=2;i<=n;++i)
{
if (!vis[i]) prime[++cnt]=i;
for (RI j=1;j<=cnt&&i*Pi<=n;++j)
{
vis[i*Pi]=1; if (i%Pi==0) break;
}
}
}
#undef Pi
int main()
{
Euler(N); while (scanf("%d%d%d",&a,&b,&c),a)
{
RI i; for (F.init(b),i=0;i<=b;++i) S[i]=H[i]=C[i]=D[i]=Complex(vis[i],0);
for (i=b+1;i<lim;++i) S[i]=H[i]=C[i]=D[i]=Complex(0,0);
for (i=1;i<=c;++i)
{
scanf("%d%c",&x,&opt); switch (opt)
{
case 'S':S[x]=Complex(0,0);break;
case 'H':H[x]=Complex(0,0);break;
case 'C':C[x]=Complex(0,0);break;
case 'D':D[x]=Complex(0,0);break;
}
}
for (F.FFT(S,1),F.FFT(H,1),F.FFT(C,1),F.FFT(D,1),i=0;i<lim;++i)
S[i]=S[i]*H[i]*C[i]*D[i]; F.FFT(S,-1);
for (i=a;i<=b;++i) printf("%lld\n",(long long)(S[i].x/lim+0.5)); putchar('\n');
}
return 0;
}
UVA12298 Super Poker II的更多相关文章
- UVa12298 Super Poker II(母函数 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/23590 Description I have a set of super poker cards, ...
- UVA - 12298 Super Poker II NTT
UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...
- bzoj2487: Super Poker II
Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...
- Super Poker II UVA - 12298 FFT_生成函数
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...
- FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II
题目:就是现在有一堆扑克里面的牌有无数张, 每种合数的牌有4中不同花色各一张(0, 1都不是合数), 没有质数或者大小是0或者1的牌现在这堆牌中缺失了其中的 c 张牌, 告诉你a, b, c接下来c张 ...
- UVA - 12298 Super Poker II (FFT+母函数)
题意:有四种花色的牌,每种花色的牌中只能使用数值的约数个数大于2的牌.现在遗失了c张牌.每种花色选一张,求值在区间[a,b]的每个数值的选择方法有多少. 分析:约数个数大于2,即合数.所以先预处理出5 ...
- UVA 12298 Super Poker II (FFT)
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using ...
- 浅谈FFT(快速傅里叶变换)
本文主要简单写写自己在算法竞赛中学习FFT的经历以及一些自己的理解和想法. FFT的介绍以及入门就不赘述了,网上有许多相关的资料,入门的话推荐这篇博客:FFT(最详细最通俗的入门手册),里面介绍得很详 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 【效率工具】史上最好用的SSH一键登录脚本,超强更新!
说明 虽然已经是凌晨,但丝毫不能掩盖我激动的心情,今天完成了对GotoSSH的一次大更新,新增了两个肥肠实用的功能,我只能说,是真的好用,话不多说,先来看效果图: 普通的一键登录: 一键登录跳板机,然 ...
- git 入门教程之备忘录[译]
备忘录[译] 创建 | Create 克隆一个已存在的仓库 | Clone an existing repository git clone git@github.com:snowdreams1006 ...
- vue的diff算法
前言 我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时, ...
- [20190219]那个更快(11g).txt
[20190219]那个更快(11g).txt --//前几天测试11g Query Result Cache RC Latches时,链接http://blog.itpub.net/267265/v ...
- shell编程—运算符(五)
算术运算符 expr 是一款表达式计算工具,使用它能完成表达式的求值操作 加法:expr a+b 两个数相加使用的是反引号`而不是单引号‘’ 减法:expr a-b 乘法:expr a\*b 除法:e ...
- python高级(2)—— 基础回顾2
回顾知识 一 操作系统的作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口 管理.调度进程,并且将多个进程对硬件的竞争变得有序 关于操作系统的发展史,可以参考我之前的一篇博文:传送门 二 多道技术: ...
- MySQL数据库有哪些安全相关的参数需要修改?
https://dev.mysql.com/doc/refman/5.7/en/security-options.htmlhttps://dev.mysql.com/doc/refman/5.7/en ...
- SQL Server 创建用户报错:消息 15023,级别 16,状态 1,第 1 行 用户、组或角色 'XXX' 在当前数据库中已存在。
问题描述: 原因: 当数据库恢复到其他服务器时,原数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户. 这种情况可能会出现上面的问题.该问题是无法通过新建登录或者是 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用
C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebRequest 和 HttpWebResponse,来判断一个网页地址是否可以正常访问. 1 ...
- C# -- 内插字符串的使用
C# -- 内插字符串的使用 (1) 字符串文本以 $ 字符开头,后接左双引号字符. $ 符号和引号字符之间不能有空格.(2) 内插字符串表达式的结果可以是任何数据类型.(3) 可通过在内插表达式后接 ...