1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int N = 1000005;
  8. const long double pi = acos(-1.0);
  9.  
  10. struct Complex
  11. {
  12. long double r,i;
  13. Complex(long double r=0, long double i=0):r(r),i(i) {};
  14. Complex operator+(const Complex &rhs)
  15. {
  16. return Complex(r + rhs.r,i + rhs.i);
  17. }
  18. Complex operator-(const Complex &rhs)
  19. {
  20. return Complex(r - rhs.r,i - rhs.i);
  21. }
  22. Complex operator*(const Complex &rhs)
  23. {
  24. return Complex(r*rhs.r - i*rhs.i,i*rhs.r + r*rhs.i);
  25. }
  26. } pS[N], pH[N], pC[N], pD[N];
  27. //len = 2^M,reverse F[i] with F[j] j为i二进制反转
  28. void rader(Complex F[],int len)
  29. {
  30. int j = len >> 1;
  31. for(int i = 1; i < len - 1; ++i)
  32. {
  33. if(i < j) swap(F[i],F[j]); // reverse
  34. int k = len>>1;
  35. while(j>=k)
  36. {
  37. j -= k;
  38. k >>= 1;
  39. }
  40. if(j < k) j += k;
  41. }
  42. }
  43.  
  44. void FFT(Complex F[],int len,int t)
  45. {
  46. rader(F,len);
  47. for(int h=2; h<=len; h<<=1)
  48. {
  49. Complex wn(cos(-t*2*pi/h),sin(-t*2*pi/h));
  50. for(int j=0; j<len; j+=h)
  51. {
  52. Complex E(1,0); //旋转因子
  53. for(int k=j; k<j+h/2; ++k)
  54. {
  55. Complex u = F[k];
  56. Complex v = E*F[k+h/2];
  57. F[k] = u+v;
  58. F[k+h/2] = u-v;
  59. E=E*wn;
  60. }
  61. }
  62. }
  63. if(t==-1) //IDFT
  64. for(int i=0; i<len; ++i)
  65. F[i].r/=len;
  66. }
  67.  
  68. void Conv(Complex a[],Complex b[],int len) //求卷积
  69. {
  70. FFT(a,len,1);
  71. FFT(b,len,1);
  72. for(int i=0; i<len; ++i) a[i] = a[i]*b[i];
  73. FFT(a,len,-1);
  74. }
  75.  
  76. long prime[N] = {0},num_prime = 0;
  77. int isNotPrime[N] = {1, 1};
  78. void init()
  79. {
  80. for(long i = 2 ; i < N ; i ++)
  81. {
  82. if(! isNotPrime[i])
  83. prime[num_prime ++]=i;
  84. for(long j = 0 ; j < num_prime && i * prime[j] < N ; j ++)
  85. {
  86. isNotPrime[i * prime[j]] = 1;
  87. if( !(i % prime[j] ) )
  88. break;
  89. }
  90. }
  91. }
  92.  
  93. int main()
  94. {
  95. int A, B, C;
  96. init();
  97. while(scanf("%d%d%d", &A, &B, &C) && (A+B+C))
  98. {
  99. memset(pS, 0, sizeof(pS));
  100. memset(pH, 0, sizeof(pH));
  101. memset(pC, 0, sizeof(pC));
  102. memset(pD, 0, sizeof(pD));
  103. for(int i=2; i<=B; ++i)
  104. if(isNotPrime[i])
  105. pS[i]=pH[i]=pC[i]=pD[i]=Complex(1);
  106. int len=1;
  107. while(len<B) len<<=1;
  108. len<<=3;
  109. while(C--)
  110. {
  111. int v;
  112. char type;
  113. scanf("%d%c", &v, &type);
  114. switch(type)
  115. {
  116. case 'S':pS[v]=Complex(0);break;
  117. case 'H':pH[v]=Complex(0);break;
  118. case 'C':pC[v]=Complex(0);break;
  119. case 'D':pD[v]=Complex(0);break;
  120. }
  121. }
  122. FFT(pS, len, 1), FFT(pH, len, 1), FFT(pC, len, 1), FFT(pD, len, 1);
  123. for(int i=0; i<len; ++i)
  124. pS[i]=pS[i]*pH[i]*pC[i]*pD[i];
  125. FFT(pS, len, -1);
  126. for(int i=A; i<=B; ++i)
  127. printf("%lld\n", (long long)(pS[i].r+0.5));
  128. puts("");
  129. }
  130. return 0;
  131. }

UVA 12298 Super Poker II (FFT)的更多相关文章

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

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

  2. UVA - 12298 Super Poker II NTT

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

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

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

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

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

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

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

  6. bzoj2487: Super Poker II

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

  7. UVA12298 Super Poker II

    怎么又是没人写题解的UVA好题,个人感觉应该是生成函数的大板子题了. 直接做肯定爆炸,考虑来一发优化,我们记一个多项式,其中\(i\)次项的系数就表示对于\(i\)这个数有多少种表示方式. 那么很明显 ...

  8. UVA 11426 - GCD - Extreme (II) (数论)

    UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...

  9. UVA 10869 - Brownie Points II(树阵)

    UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线.然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分 ...

随机推荐

  1. Linux下用户的创建与删除

    我们在Linux下创建用户主要有两种方式:adduser和useradd,它们的区别以及主要用法如下: adduser adduser的用法很简单,只需adduser+username即可,如下: s ...

  2. 使用vscode编辑和提交github仓库代码

    写在前面 在github上想删除仓库中的某个文件或文件夹,亦或是重命名操作都很麻烦,这里提供一种vscode的解决方案.在vscode中克隆远程github仓库,然后对代码或文件进行编辑,最后提交即可 ...

  3. 实现队列的基本操作(数据结构)-python版

    class Queue: def __init__(self): self.entries = [] self.length = 0 self.front = 0 def put(self, item ...

  4. Java随谈(二)对空指针异常的碎碎念

    本文适合对 Java 空指针痛彻心扉的人阅读,推荐阅读时间25分钟. 若有一些Java8 函数式编程的基础可以当成对基础知识的巩固. 一.万恶的null 今天,我们简单谈谈null的问题.因为null ...

  5. Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

    内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了

  6. 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)

    一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...

  7. Mysql中把varchar类型的字段转化为tinyint类型的字段

    因为之前不知道tinyint类型的用法,所以将一些状态属性字段类型设置成了varchar类型,然后用"是"和"否"来判断状态 后来了解到了tinyint,就想试 ...

  8. Layman 对PHP源码进行加密保护

    加密软件(php_screw) >下载网站:http://sourceforge.net/projects/php-screw/ >描述:php文件通常以文本格式存贮在服务器端, 很容易被 ...

  9. spring-boot-route(八)整合mybatis操作数据库

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  10. 温故知新——C++--封装

      参考: 1.https://blog.csdn.net/cherrydreamsover/article/details/81942293 2.https://www.cnblogs.com/ji ...