题目链接: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. spring利用cors处理跨域问题

    参考 http://blog.csdn.net/isea533/article/details/50449907 写的很全面 http://blog.csdn.net/a317560315/artic ...

  2. python 计数器Counter

    from collections import Counter colours=( ('Yasoob','Yellow',1), ('Ali','Blue',2), ('Arham','Green', ...

  3. mvp需要加上单利模式

    最大的中介者,需要设置成单利模式

  4. centos 6.5搭建LNMP环境

    1:查看环境: 1 2 [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 1 [r ...

  5. nyoj 456——邮票分你一半——————【背包思想搜索】

    邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...

  6. [转]微信小程序开发系列(一)小程序开发初体验

    本文转自:http://www.cnblogs.com/rennix/p/6287432.html 开发小程序所需的基本技能   关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领 ...

  7. C# this关键字的四种用法(转)

    用法一  this代表当前类的实例对象 namespace Demo { public class Test { private string scope = "全局变量"; pu ...

  8. 使用Git(msysgit)和TortoiseGit上传代码到GitHub

    1.准备 下载Git for Windows (msysgit) 下载TortoiseGit 安装过程很简单,一直点击下一步到完成即可. 2.配置TortoiseGit 1.双击TortoiseGit ...

  9. 浅谈------location

    今天在上班的时候碰到了要根据不同的页面随机添加栏目的问题,很简单的问题,想到了判断页面url是否含有某字符串来进行随机添加栏目...这就需要了解location对象. location 属性名 属性说 ...

  10. mybatis一对多映射

    场景: A:SecControlRulePojo.java B:SecControlSubRulePojo C:SecControlSubRuleManyPojo 实体A中包含List<B> ...