怎么又是没人写题解的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的更多相关文章

  1. UVa12298 Super Poker II(母函数 + FFT)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/23590 Description I have a set of super poker cards, ...

  2. UVA - 12298 Super Poker II NTT

    UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...

  3. bzoj2487: Super Poker II

    Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...

  4. Super Poker II UVA - 12298 FFT_生成函数

    Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...

  5. FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II

    题目:就是现在有一堆扑克里面的牌有无数张, 每种合数的牌有4中不同花色各一张(0, 1都不是合数), 没有质数或者大小是0或者1的牌现在这堆牌中缺失了其中的 c 张牌, 告诉你a, b, c接下来c张 ...

  6. UVA - 12298 Super Poker II (FFT+母函数)

    题意:有四种花色的牌,每种花色的牌中只能使用数值的约数个数大于2的牌.现在遗失了c张牌.每种花色选一张,求值在区间[a,b]的每个数值的选择方法有多少. 分析:约数个数大于2,即合数.所以先预处理出5 ...

  7. UVA 12298 Super Poker II (FFT)

    #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using ...

  8. 浅谈FFT(快速傅里叶变换)

    本文主要简单写写自己在算法竞赛中学习FFT的经历以及一些自己的理解和想法. FFT的介绍以及入门就不赘述了,网上有许多相关的资料,入门的话推荐这篇博客:FFT(最详细最通俗的入门手册),里面介绍得很详 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. JAVA TestNG单元测试详解

    TestNG单元测试详解   by:授客 QQ:1033553122 1. 测试环境 2 2. 介绍 2 3. Annotation 2 4. testng.xml 3 4.1. 例1 3 4.2. ...

  2. android 圆角背景

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  3. html5常见新增标签

    本文内容: header nav article footer section aside datalist 音频标签: audio 视频标签: video 插入媒体标签: embed 新增input ...

  4. 运行svn tortoiseSvn cleanup 命令失败的解决办法

    这个时候请使用命令行模式运行 svn clean up 然后世界和平了:)

  5. Scala隐式参数

    Scala方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,将自动传递. Scal ...

  6. linux安装教程

    一.安装准备工作 虚拟机VMWARE10 镜像文件CentOs6.5 二.安装过程 1.启动VMWARE10,点击创建新的虚拟机. 2.选择典型安装即可 3.这里我们选择稍后再进行安装操作系统,因为这 ...

  7. Oracle 锁机制探究

    以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考官网以及Tom Tyke的<Oracle 9i/10g/11g编程艺术>一书整理了一下O ...

  8. 全局Ajax加载时呈现Loading

    全局设置: 1 2 3 4 5 $(document).bind("ajaxSend", function () {         $("#loading_messag ...

  9. 8. svg学习笔记-文本

    毫无疑问,文本也是svg中组成的重要部分,在svg中,用<text>元素来创建文本,文本的使用格式如下: <text x="20" y="30" ...

  10. 持续集成-Jenkins安装部署

    1. 安装JDK[java8] 1.1. 软件安装 [yun@mini05 software]# pwd /app/software [yun@mini05 software]# .0_112.tar ...