UVA 12298 Super Poker II (FFT)
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N = 1000005;
- const long double pi = acos(-1.0);
- struct Complex
- {
- long double r,i;
- Complex(long double r=0, long double i=0):r(r),i(i) {};
- Complex operator+(const Complex &rhs)
- {
- return Complex(r + rhs.r,i + rhs.i);
- }
- Complex operator-(const Complex &rhs)
- {
- return Complex(r - rhs.r,i - rhs.i);
- }
- Complex operator*(const Complex &rhs)
- {
- return Complex(r*rhs.r - i*rhs.i,i*rhs.r + r*rhs.i);
- }
- } pS[N], pH[N], pC[N], pD[N];
- //len = 2^M,reverse F[i] with F[j] j为i二进制反转
- void rader(Complex F[],int len)
- {
- int j = len >> 1;
- for(int i = 1; i < len - 1; ++i)
- {
- if(i < j) swap(F[i],F[j]); // reverse
- int k = len>>1;
- while(j>=k)
- {
- j -= k;
- k >>= 1;
- }
- if(j < k) j += k;
- }
- }
- void FFT(Complex F[],int len,int t)
- {
- rader(F,len);
- for(int h=2; h<=len; h<<=1)
- {
- Complex wn(cos(-t*2*pi/h),sin(-t*2*pi/h));
- for(int j=0; j<len; j+=h)
- {
- Complex E(1,0); //旋转因子
- for(int k=j; k<j+h/2; ++k)
- {
- Complex u = F[k];
- Complex v = E*F[k+h/2];
- F[k] = u+v;
- F[k+h/2] = u-v;
- E=E*wn;
- }
- }
- }
- if(t==-1) //IDFT
- for(int i=0; i<len; ++i)
- F[i].r/=len;
- }
- void Conv(Complex a[],Complex b[],int len) //求卷积
- {
- FFT(a,len,1);
- FFT(b,len,1);
- for(int i=0; i<len; ++i) a[i] = a[i]*b[i];
- FFT(a,len,-1);
- }
- long prime[N] = {0},num_prime = 0;
- int isNotPrime[N] = {1, 1};
- void init()
- {
- for(long i = 2 ; i < N ; i ++)
- {
- if(! isNotPrime[i])
- prime[num_prime ++]=i;
- for(long j = 0 ; j < num_prime && i * prime[j] < N ; j ++)
- {
- isNotPrime[i * prime[j]] = 1;
- if( !(i % prime[j] ) )
- break;
- }
- }
- }
- int main()
- {
- int A, B, C;
- init();
- while(scanf("%d%d%d", &A, &B, &C) && (A+B+C))
- {
- memset(pS, 0, sizeof(pS));
- memset(pH, 0, sizeof(pH));
- memset(pC, 0, sizeof(pC));
- memset(pD, 0, sizeof(pD));
- for(int i=2; i<=B; ++i)
- if(isNotPrime[i])
- pS[i]=pH[i]=pC[i]=pD[i]=Complex(1);
- int len=1;
- while(len<B) len<<=1;
- len<<=3;
- while(C--)
- {
- int v;
- char type;
- scanf("%d%c", &v, &type);
- switch(type)
- {
- case 'S':pS[v]=Complex(0);break;
- case 'H':pH[v]=Complex(0);break;
- case 'C':pC[v]=Complex(0);break;
- case 'D':pD[v]=Complex(0);break;
- }
- }
- FFT(pS, len, 1), FFT(pH, len, 1), FFT(pC, len, 1), FFT(pD, len, 1);
- for(int i=0; i<len; ++i)
- pS[i]=pS[i]*pH[i]*pC[i]*pD[i];
- FFT(pS, len, -1);
- for(int i=A; i<=B; ++i)
- printf("%lld\n", (long long)(pS[i].r+0.5));
- puts("");
- }
- return 0;
- }
UVA 12298 Super Poker II (FFT)的更多相关文章
- UVA - 12298 Super Poker II (FFT+母函数)
题意:有四种花色的牌,每种花色的牌中只能使用数值的约数个数大于2的牌.现在遗失了c张牌.每种花色选一张,求值在区间[a,b]的每个数值的选择方法有多少. 分析:约数个数大于2,即合数.所以先预处理出5 ...
- UVA - 12298 Super Poker II NTT
UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...
- FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II
题目:就是现在有一堆扑克里面的牌有无数张, 每种合数的牌有4中不同花色各一张(0, 1都不是合数), 没有质数或者大小是0或者1的牌现在这堆牌中缺失了其中的 c 张牌, 告诉你a, b, c接下来c张 ...
- Super Poker II UVA - 12298 FFT_生成函数
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...
- UVa12298 Super Poker II(母函数 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/23590 Description I have a set of super poker cards, ...
- bzoj2487: Super Poker II
Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...
- UVA12298 Super Poker II
怎么又是没人写题解的UVA好题,个人感觉应该是生成函数的大板子题了. 直接做肯定爆炸,考虑来一发优化,我们记一个多项式,其中\(i\)次项的系数就表示对于\(i\)这个数有多少种表示方式. 那么很明显 ...
- UVA 11426 - GCD - Extreme (II) (数论)
UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...
- UVA 10869 - Brownie Points II(树阵)
UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线.然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分 ...
随机推荐
- Linux下用户的创建与删除
我们在Linux下创建用户主要有两种方式:adduser和useradd,它们的区别以及主要用法如下: adduser adduser的用法很简单,只需adduser+username即可,如下: s ...
- 使用vscode编辑和提交github仓库代码
写在前面 在github上想删除仓库中的某个文件或文件夹,亦或是重命名操作都很麻烦,这里提供一种vscode的解决方案.在vscode中克隆远程github仓库,然后对代码或文件进行编辑,最后提交即可 ...
- 实现队列的基本操作(数据结构)-python版
class Queue: def __init__(self): self.entries = [] self.length = 0 self.front = 0 def put(self, item ...
- Java随谈(二)对空指针异常的碎碎念
本文适合对 Java 空指针痛彻心扉的人阅读,推荐阅读时间25分钟. 若有一些Java8 函数式编程的基础可以当成对基础知识的巩固. 一.万恶的null 今天,我们简单谈谈null的问题.因为null ...
- Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏
内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了
- 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)
一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...
- Mysql中把varchar类型的字段转化为tinyint类型的字段
因为之前不知道tinyint类型的用法,所以将一些状态属性字段类型设置成了varchar类型,然后用"是"和"否"来判断状态 后来了解到了tinyint,就想试 ...
- Layman 对PHP源码进行加密保护
加密软件(php_screw) >下载网站:http://sourceforge.net/projects/php-screw/ >描述:php文件通常以文本格式存贮在服务器端, 很容易被 ...
- spring-boot-route(八)整合mybatis操作数据库
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- 温故知新——C++--封装
参考: 1.https://blog.csdn.net/cherrydreamsover/article/details/81942293 2.https://www.cnblogs.com/ji ...