sacgajcvs

Untitled

Mar 17th, 2020
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. /*
  2. _____ _ _ _ _
  3. |_ _| |__ ___ / \ _ __ ___| |__ _ _| |
  4. | | | '_ \ / _ \ / _ \ | '_ \/ __| '_ \| | | | |
  5. | | | | | | __// ___ \| | | \__ \ | | | |_| | |
  6. |_| |_| |_|\___/_/ \_\_| |_|___/_| |_|\__,_|_|
  7.  
  8. */
  9. #include<bits/stdc++.h>
  10. #include <ext/pb_ds/assoc_container.hpp>
  11. #include <ext/pb_ds/tree_policy.hpp>
  12. #define ll long long
  13. #define pb push_back
  14. #define ppb pop_back
  15. #define endl '\n'
  16. #define mii map<ll,ll>
  17. #define msi map<string,ll>
  18. #define mis map<ll, string>
  19. #define rep(i,a,b) for(ll i=a;i<b;i++)
  20. #define repr(i,a,b) for(ll i=b-1;i>=a;i--)
  21. #define trav(a, x) for(auto& a : x)
  22. #define pii pair<ll,ll>
  23. #define vi vector<ll>
  24. #define vii vector<pair<ll, ll>>
  25. #define vs vector<string>
  26. #define all(a) (a).begin(),(a).end()
  27. #define F first
  28. #define S second
  29. #define sz(x) (ll)x.size()
  30. #define hell 1009
  31. #define lbnd lower_bound
  32. #define ubnd upper_bound
  33. #define max(a,b) (a>b?a:b)
  34. #define min(a,b) (a<b?a:b)
  35.  
  36. /* For Debugging */
  37. #define DEBUG cerr<<"\n>>>I'm Here<<<\n"<<endl;
  38. #define display(x) trav(a,x) cout<<a<<" ";cout<<endl;
  39. #define what_is(x) cerr << #x << " is " << x << endl;
  40.  
  41. std::mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count());
  42. #define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>
  43. #define TIME cerr << "\nTime elapsed: " << setprecision(5) <<1000.0 * clock() / CLOCKS_PER_SEC << "ms\n";
  44. #define DECIMAL(n) cout << fixed ; cout << setprecision(n);
  45. #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  46. using namespace __gnu_pbds;
  47. using namespace std;
  48. // #define PI 3.141592653589793
  49. #define N 200005
  50.  
  51. using cd = complex<double>;
  52. const double PI = acos(-1);
  53.  
  54. vi srss;
  55. // vi pw,pw1;
  56.  
  57. ll expo(ll base, ll exponent, ll mod) { //return base^exponent modulo modulus
  58. ll ans = 1;
  59. while(exponent !=0 ) {
  60. if((exponent&1) == 1) {
  61. ans = ans*base ;
  62. ans = ans%mod;
  63. }
  64. base = base*base;
  65. base %= mod;
  66. exponent>>= 1;
  67. }
  68. return ans%mod;
  69. }
  70.  
  71. void fft(vector<cd> & a, bool invert) {
  72. int n = a.size();
  73.  
  74. for (int i = 1; i < n; i++) {
  75. if (i < srss[i])
  76. swap(a[i], a[srss[i]]);
  77. }
  78.  
  79. for (int len = 2; len <= n; len <<= 1) {
  80. double ang = 2 * PI / len * (invert ? -1 : 1);
  81. cd wlen(cos(ang), sin(ang));
  82. for (int i = 0; i < n; i += len) {
  83. cd w(1);
  84. for (int j = 0; j < len / 2; j++) {
  85. cd u = a[i+j], v = a[i+j+len/2] * w;
  86. a[i+j] = u + v;
  87. a[i+j+len/2] = u - v;
  88. w *= wlen;
  89. }
  90. }
  91. }
  92.  
  93. if (invert) {
  94. for (cd & x : a)
  95. x /= n;
  96. }
  97. }
  98.  
  99. vector<int> multiply(vector<int> const& a, vector<int> const& b) {
  100. vector<cd> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  101. int n = 1;
  102. while (n < a.size() + b.size())
  103. n <<= 1;
  104. fa.resize(n);
  105. fb.resize(n);
  106.  
  107. fft(fa, false);
  108. fft(fb, false);
  109. for (int i = 0; i < n; i++)
  110. fa[i] *= fb[i];
  111. fft(fa, true);
  112.  
  113. vector<int> result(n);
  114. for (int i = 0; i < n; i++)
  115. result[i] = round(fa[i].real());
  116. return result;
  117. }
  118.  
  119. void solve()
  120. {
  121. ll n,k,m;
  122. cin>>n>>m>>k;
  123. ll tmp=1;
  124. while(tmp<=n+m)
  125. tmp<<=1;
  126. srss.resize(tmp);
  127. for (int i = 1, j = 0; i < n; i++) {
  128. int bit = n >> 1;
  129. for (; j & bit; bit >>= 1)
  130. j ^= bit;
  131. j ^= bit;
  132.  
  133. srss[i]=j;
  134. }
  135. vi v(m,0);;
  136. ll x;
  137. rep(i,0,n)
  138. {
  139. cin>>x;
  140. x--;
  141. v[x]++;
  142. }
  143. // pw.resize(tmp);
  144. // pw1.resize(tmp);
  145. // pw[0]=1;
  146. // rep(i,1,tmp)
  147. // {
  148. // pw[i]=(pw[i-1]*i)%hell;
  149. // }
  150. // rep(i,0,tmp)
  151. // {
  152. // pw1[i]=expo(pw[i],hell-2,hell);
  153. // }
  154. vector<cd> a[m];
  155. rep(i,0,m)
  156. {
  157. rep(j,0,v[i]+1)
  158. a[i].pb(cd(1));
  159. }
  160. rep(i,0,m)
  161. {
  162. a[i].resize(tmp);
  163. fft(a[i],false);
  164. }
  165. // rep(i,0,m)
  166. // {
  167. // rep(j,0,sz(a[i]))
  168. // cout<<a[i][j].real()<<" ";
  169. // cout<<endl;
  170. // }
  171. rep(i,0,tmp)
  172. {
  173. rep(j,1,m)
  174. a[0][i]*=a[j][i];
  175. }
  176. fft(a[0],true);
  177. rep(i,0,tmp)
  178. cout<<round(a[0][i].real())<<" ";
  179. cout<<endl;
  180. ll num=round(a[0][k].real());
  181. cout<<num<<endl;
  182. return;
  183. }
  184. int main()
  185. {
  186. FAST
  187. int TESTS=1;
  188. // cin>>TESTS;
  189. while(TESTS--)
  190. {
  191. solve();
  192. }
  193. TIME
  194. return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment