题目链接: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. PIXI 根据点走地图(8)

    先了解下数学公式例如: 图已知:a.b两点的坐标, c到a的距离d .求c点的坐标.   求 cy 可以根据d / a到b距离 = a到c垂直距离 / a 到 b的垂直距离.   首先求a到b的距离 ...

  2. rancher初级(搭建+基本操作+web应用部署)

    Rancher搭建 首先rancher需要安装了docker的linux环境,我的系统版本为 在docker的基础上启动rancher服务器,Rancher 服务器是一个 Docker image,所 ...

  3. Mac下Jenkins+SVN+Xcode构建持续导出环境

    1 安装Jenkins Jenkins是基于Java开发的一种持续集成工具.所以呢,要使用Jenkins必须使用先安装JDK. JDK安装 JDK 下载地址 jdk 1.8.png 安装JDK的过程略 ...

  4. CentOS6 克 隆

    原始机子关机 自己设置名字 保存地址 开机 配置hosts   后面的为你要设置的名字不配置可能xshell链接上不了网 更改名字: 配置网卡 删除物理地址 mac 和  uuid 删除网卡 重启

  5. 使用JavaFX打开fxml,找不到打开的图形界面

    解决方案: 将 HKEY_CURRENT_USER\Software\JavaSoft\Prefs\com\oracle\javafx\scenebuilder\app\preferences\/S/ ...

  6. URLEncoder.encode问题

    遇到java里的URLEncoder.encode方法编码后与javascript的encodeURIComponent方法的结果有点不一样,找了一下资料,原来URLEncoder实现的是HTML形式 ...

  7. [转]实例化SqlParameter时,如果是字符型,一定要指定size属性

    转自:http://bbs.csdn.net/topics/380155255 以前在实例化SqlParameter时,通常都是用下面的语句,没有设置size属性: new SqlParameter( ...

  8. linux下Oracle 相关命令

    #注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录.#你可以自己修改成自己的目录. A.#dbstart //启动数据库 #d ...

  9. gcc链接非标准(non-standard)命名库

    标准命名库: -lnamespace 标准链接库以lib开头, 并以so/a结尾. example gcc test.c -o test -L. -lhello 非标准命名库: -l:libname ...

  10. s中的闭包

    今天看了关于js闭包方面的文章,还是有些云里雾里,对于一个菜鸟来说,学习闭包确实有一定的难度,不说别的,能够在网上找到一篇优秀的是那样的不易. 当然之所以闭包难理解,个人觉得是基础知识掌握的不牢,因为 ...