题目链接:https://vjudge.net/problem/UVA-12298

题意:

1、超级扑克,每种花色有无数张牌,但是,这些牌都是合数;比如黑桃:4,6,8,9,10,,,,

2、现在拿走了一些牌;

3、从每种花色里面抽取一张牌,和为 n ,有多少种方案;

4、现在 和 n 是一个区间,a到b;

分析:

四种花色,每种取一张,有多少种方案?

和 为 n ,即 将4个多项式乘起来,指数为 n ,就得到了和为 N 的一种方案,那么方案种数就是他的系数;

将这些多项式相乘使用FFT

模板是lrj大神的;哈哈;

 #include <complex>
#include <cmath>
#include <vector>
#include <cstring>
#include <cstdio> using namespace std; const long double PI = acos(0.0)*2.0;
typedef complex<double> CD; // Cooley-Tukey的FFT算法,迭代实现。inverse = false时计算逆FFT
inline void FFT(vector<CD> &a, bool inverse) {
int n = a.size();
// 原地快速bit reversal
for(int i = , j = ; i < n; i++) {
if(j > i) swap(a[i], a[j]);
int k = n;
while(j & (k >>= )) j &= ~k;
j |= k;
} double pi = inverse ? -PI : PI;
for(int step = ; step < n; step <<= ) {
// 把每相邻两个“step点DFT”通过一系列蝴蝶操作合并为一个“2*step点DFT”
double alpha = pi / step;
// 为求高效,我们并不是依次执行各个完整的DFT合并,而是枚举下标k
// 对于一个下标k,执行所有DFT合并中该下标对应的蝴蝶操作,即通过E[k]和O[k]计算X[k]
// 蝴蝶操作参考:http://en.wikipedia.org/wiki/Butterfly_diagram
for(int k = ; k < step; k++) {
// 计算omega^k. 这个方法效率低,但如果用每次乘omega的方法递推会有精度问题。
// 有更快更精确的递推方法,为了清晰起见这里略去
CD omegak = exp(CD(, alpha*k));
for(int Ek = k; Ek < n; Ek += step << ) { // Ek是某次DFT合并中E[k]在原始序列中的下标
int Ok = Ek + step; // Ok是该DFT合并中O[k]在原始序列中的下标
CD t = omegak * a[Ok]; // 蝴蝶操作:x1 * omega^k
a[Ok] = a[Ek] - t; // 蝴蝶操作:y1 = x0 - t
a[Ek] += t; // 蝴蝶操作:y0 = x0 + t
}
}
} if(inverse)
for(int i = ; i < n; i++) a[i] /= n;
} inline vector<double> operator * (const vector<double>& v1,const vector<double>& v2) {
int s1 = v1.size(),s2=v2.size(),S=;
while(S < s1 + s2) S <<= ;
vector<CD> a(S,), b(S,); // 把FFT的输入长度补成2的幂,不小于v1和v2的长度之和
for(int i = ; i < s1; i++) a[i] = v1[i];
FFT(a, false);
for(int i = ; i < s2; i++) b[i] = v2[i];
FFT(b, false);
for(int i = ; i < S; i++) a[i] *= b[i];
FFT(a, true);
vector<double> res(s1 + s2 - );
for(int i = ; i < s1 + s2 - ; i++) res[i] = a[i].real(); // 虚部均为0
return res; } const int maxn = + ;
int composite[maxn]; void sieve(int n) {
int m = (int)sqrt(n+0.5);
memset(composite,,sizeof(composite));
for(int i=; i<=m; i++) {
if(!composite[i])
for(int j=i*i; j<=n; j+=i)
composite[j] = ;
}
} const char* suites = "SHCD";
int idx(char suit) {
return strchr(suites,suit)-suites;
} int lost[][maxn]; //4张花色是否丢了
int main() {
sieve();
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c),a) {
memset(lost,,sizeof(lost));
for(int i=; i<c; i++) {
int d;
char s;
scanf("%d%c",&d,&s);
lost[idx(s)][d] = ;
} vector<double> ans(,),poly;
for(int s=; s<; s++) {
poly.clear();
poly.resize(b+,);
for(int i=; i<=b; i++) //合数里面挑,并且没有被拿走
if(composite[i]&&!lost[s][i]) poly[i]=1.0;
ans = ans*poly;
//ans.resize(b+1);
}
for(int i=a; i<=b; i++)
printf("%0.lf\n",fabs(ans[i]));
puts("");
} return ;
}

Uva 12298 超级扑克2的更多相关文章

  1. UVA - 12298 Super Poker II NTT

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

  2. UVa 11488 超级前缀集合(Trie的应用)

    https://vjudge.net/problem/UVA-11488 题意: 给定一个字符串集合S,定义P(s)为所有字符串的公共前缀长度与S中字符串个数的乘积.比如P( {000, 001, 0 ...

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

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

  4. UVa 10883 超级平均数(二项式系数+对数计算)

    https://vjudge.net/problem/UVA-10883 题意: 给出n个数,每相邻两个数求平均数,依次类推,最后得到1个数,求该数. 思路: 演算一下可以发现最后各个数的系数就是二项 ...

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

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

  6. UVA 12298 Super Poker II (FFT)

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

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

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

  8. UVa12298(生成函数的简单应用+FFT)

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

  9. UVA 11752 The Super Powers【超级幂】

    题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=111527#problem/Z 题意: 我们称一个可以由至少两个不同正整数的幂 ...

随机推荐

  1. sed命令——批量修改文件内容

    批量替换单个文件内容 命令格式:sed -i 's/旧内容/新内容/g' 文件路径 sed -i 's/oldString/newString/g' file 例如:我想替换cwx.txt文件中的 j ...

  2. vue之理解异步更新 --- nextTick

    默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入 ...

  3. html5中新增的语义化的标签

    html5是html最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定.目标是取代1999年所制定的HTML 4.01和XHTML 1.0标准,以期能在互联网应用迅速发展的时候,使网络 ...

  4. 搭建基于Ubuntu的开发环境

    基于ubuntu 16.04 LTS经验 分区方案 内存:4G,硬盘:500G 分区 大小 说明 备注 / 20G 说明 swap 6G 说明 /tmp 15G 临时文件 /var 40G 可变数据目 ...

  5. centos7 中文乱码问题解决方法

    1.查看是否安装中文包 可以使用下面的命名查看系统是否安装了中文安装包. locale -a |grep "zh_CN" 没有输出,说明没有安装,输入下面的命令安装: yum gr ...

  6. 【ExtJS】关于alias和xtype

    alias 在api里的解释为:别名 类名称简短的别名列表.多数用于定义xtypes Ext.define('MyApp.Panel', { extend: 'Ext.panel.Panel', al ...

  7. BNU27932——Triangle——————【数学计算面积】

    Triangle Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class nam ...

  8. CTPN_论文阅读总结

    论文全名:Detecting Text in Natural Image with Connectionist Text Proposal Network 1.摘要 (1)本文提出新型网络CTPN,用 ...

  9. AndroidManifest.xml配置文件详解(转载)

     AndroidManifest.xml配置文件详解 2013-01-05 10:25:23 分类: Android平台 AndroidManifest.xml配置文件对于Android应用开发来说是 ...

  10. Spring3.2下使用JavaMailSenderImpl类发送邮件

    1.JavaMailSenderImpl类 Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类JavaMailSenderImpl,这个类是发送邮件的核心类 ...