UVA 12298 Super Poker II(FFT)

心已赠人 2022-08-05 05:10 14阅读 0赞

题意:
每个花色恰好选择一张牌
能够构成点数和大小为N的方案数
用类似生成函数的想法,多项式的幂值表示大小,前面的系数表示的是方案数
因此想到了多项式乘法,用FFT来优化

  1. // whn6325689
  2. // Mr.Phoebe
  3. // http://blog.csdn.net/u013007900
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <iomanip>
  7. #include <cstring>
  8. #include <climits>
  9. #include <complex>
  10. #include <fstream>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <bitset>
  14. #include <vector>
  15. #include <deque>
  16. #include <queue>
  17. #include <stack>
  18. #include <ctime>
  19. #include <set>
  20. #include <map>
  21. #include <cmath>
  22. #include <functional>
  23. #include <numeric>
  24. #pragma comment(linker, "/STACK:1024000000,1024000000")
  25. using namespace std;
  26. #define eps 1e-9
  27. #define PI acos(-1.0)
  28. #define INF 0x3f3f3f3f
  29. #define LLINF 1LL<<62
  30. #define speed std::ios::sync_with_stdio(false);
  31. typedef long long ll;
  32. typedef long double ld;
  33. typedef pair<ll, ll> pll;
  34. typedef complex<ld> point;
  35. typedef pair<int, int> pii;
  36. typedef pair<pii, int> piii;
  37. typedef vector<int> vi;
  38. #define CLR(x,y) memset(x,y,sizeof(x))
  39. #define CPY(x,y) memcpy(x,y,sizeof(x))
  40. #define clr(a,x,size) memset(a,x,sizeof(a[0])*(size))
  41. #define cpy(a,x,size) memcpy(a,x,sizeof(a[0])*(size))
  42. #define mp(x,y) make_pair(x,y)
  43. #define pb(x) push_back(x)
  44. #define lowbit(x) (x&(-x))
  45. #define MID(x,y) (x+((y-x)>>1))
  46. #define ls (idx<<1)
  47. #define rs (idx<<1|1)
  48. #define lson ls,l,mid
  49. #define rson rs,mid+1,r
  50. #define root 1,1,n
  51. template<class T>
  52. inline bool read(T &n)
  53. {
  54. T x = 0, tmp = 1;
  55. char c = getchar();
  56. while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
  57. if(c == EOF) return false;
  58. if(c == '-') c = getchar(), tmp = -1;
  59. while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
  60. n = x*tmp;
  61. return true;
  62. }
  63. template <class T>
  64. inline void write(T n)
  65. {
  66. if(n < 0)
  67. {
  68. putchar('-');
  69. n = -n;
  70. }
  71. int len = 0,data[20];
  72. while(n)
  73. {
  74. data[len++] = n%10;
  75. n /= 10;
  76. }
  77. if(!len) data[len++] = 0;
  78. while(len--) putchar(data[len]+48);
  79. }
  80. //-----------------------------------
  81. const int MAXN=262144;
  82. const ld pi=acos(-1.0);
  83. struct Complex
  84. {
  85. ld r,i;
  86. Complex(){}
  87. Complex(ld r ,ld i):r(r),i(i) {}
  88. Complex operator + (const Complex& t) const
  89. {
  90. return Complex(r+t.r,i+t.i) ;
  91. }
  92. Complex operator - (const Complex& t) const
  93. {
  94. return Complex(r-t.r,i-t.i);
  95. }
  96. Complex operator * (const Complex& t) const
  97. {
  98. return Complex(r*t.r-i*t.i,r*t.i+i*t.r);
  99. }
  100. }s[MAXN],h[MAXN],c[MAXN],d[MAXN];
  101. int prime[30000],tot;
  102. bool isprime[50001];
  103. void FFT(Complex y[],int n,int rev)//rev=-1表示逆变换
  104. {
  105. for(int i=1,j,k,t; i<n; i++) //进行蝶型变换
  106. {
  107. for(j=0,k=n>>1,t=i; k; k>>=1,t>>=1) j=j<<1|t&1;
  108. if(i<j ) swap(y[i],y[j]);
  109. }
  110. for ( int s = 2 , ds = 1 ; s <= n ; ds = s , s <<= 1 )
  111. {
  112. Complex wn=Complex(cos(rev*2*pi/s),sin(rev*2*pi/s)),w=Complex(1,0),t;
  113. for(int k=0; k<ds; k++,w=w*wn)
  114. {
  115. for(int i=k; i<n; i+=s)
  116. {
  117. y[i+ds]=y[i]-(t=w*y[i+ds]);
  118. y[i]=y[i]+t;
  119. }
  120. }
  121. }
  122. if(rev==-1) for(int i=0; i<n; i++) y[i].r/=n;
  123. }
  124. void genPrime(int n)
  125. {
  126. memset(isprime,true,sizeof isprime);
  127. for(int i=2; i<=n; ++i)
  128. {
  129. if(isprime[i])
  130. prime[tot++]=i;
  131. for(int j=0; j<tot&&i*prime[j]<=n; ++j)
  132. {
  133. isprime[i*prime[j]]=false;
  134. if(i%prime[j]==0) break;
  135. }
  136. }
  137. }
  138. int main()
  139. {
  140. int A,B,C;
  141. genPrime(50000);
  142. while(read(A)&&read(B)&&read(C)&&(A+B+C))
  143. {
  144. int L=1;
  145. while(L<=B) L<<=1;
  146. L<<=2;
  147. memset(s,0,sizeof s);
  148. memset(h,0,sizeof h);
  149. memset(c,0,sizeof c);
  150. memset(d,0,sizeof d);
  151. for(int i=0; i<B; ++i) if(!isprime[i]) s[i].r=1;
  152. for(int i=0; i<B; ++i) if(!isprime[i]) h[i].r=1;
  153. for(int i=0; i<B; ++i) if(!isprime[i]) c[i].r=1;
  154. for(int i=0; i<B; ++i) if(!isprime[i]) d[i].r=1;
  155. for(int i=0; i<C; ++i)
  156. {
  157. char str[20];
  158. scanf("%s",str);
  159. int len=strlen(str),t;
  160. sscanf(str,"%d",&t);
  161. switch(str[len-1])
  162. {
  163. case 'S':
  164. s[t].r=0;
  165. break;
  166. case 'H':
  167. h[t].r=0;
  168. break;
  169. case 'C':
  170. c[t].r=0;
  171. break;
  172. case 'D':
  173. d[t].r=0;
  174. break;
  175. }
  176. }
  177. FFT(s,L,1);
  178. FFT(h,L,1);
  179. FFT(c,L,1);
  180. FFT(d,L,1);
  181. for(int i=0; i<L; ++i) h[i]=s[i]*h[i]*c[i]*d[i];
  182. FFT(h,L,-1);
  183. for(int i=A; i<=B; ++i) printf("%.0lf\n",fabs((double)h[i].r));
  184. putchar('\n');
  185. }
  186. return 0;
  187. }

发表评论

表情:
评论列表 (有 0 条评论,14人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UVA11752 The Super Powers

    最近几天的状态着实不好,数电设计的答辩不能更逗,万幸是终于到家了,看到群里有各种群赛十分开心,希望能找回刷题的动力,调整下状态。 这道题是很久前做的,细节记不太清了。。。

    相关 super关键字

    super关键字的使用 1.super理解为:父类的 2.super可以用来调用:属性、方法、构造器 3.super的使用:调用属性和方法 3.1 我们可以在子类的

    相关 UVA 12298 Super Poker II(FFT)

    题意: 每个花色恰好选择一张牌 能够构成点数和大小为N的方案数 用类似生成函数的想法,多项式的幂值表示大小,前面的系数表示的是方案数 因此想到了多项式乘法,用F