Advertisement
caioaao

Untitled

Sep 10th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define MAX_K 2001
  4.  
  5. using namespace std;
  6. typedef long long ll;
  7.  
  8. class CandyDrawing{
  9. public:
  10. ll mod, memo[4*MAX_K][MAX_K];
  11.  
  12. ll mul_inv(ll a, ll b)
  13. {
  14.     ll b0 = b, t, q;
  15.     ll x0 = 0, x1 = 1;
  16.     if (b == 1) return 1;
  17.     while (a > 1) {
  18.         q = a / b;
  19.         t = b, b = a % b, a = t;
  20.         t = x0, x0 = x1 - q * x0, x1 = t;
  21.     }
  22.     if (x1 < 0) x1 += b0;
  23.     return x1;
  24. }
  25.  
  26. ll lagrange(ll p, vector<ll> &x, vector<ll> &y){
  27.   ll num, den, ans = 0;
  28.   for(size_t i = 0; i < x.size(); i++){
  29.     num = den = 1;
  30.     for(size_t j = 0; j < x.size(); j++) if(j != i){
  31.       num = (num*(p-x[j]))%mod;
  32.       den = (den*(x[i]-x[j]))%mod;
  33.     }
  34.     ans = (((num*mul_inv(den,mod))%mod)*y[i] + ans)%mod;
  35.   }
  36.   return ans + (ans < 0 ? mod : 0);
  37. }
  38.  
  39.  
  40. ll dp(int n, int k){
  41.     if(k == 0) return memo[n][k] = 1;
  42.     if(n < k) return memo[n][k] = 0;
  43.     if(memo[n][k] != -1) return memo[n][k];
  44.     return memo[n][k] = ((n*dp(n-1,k-1))%mod + dp(n-1,k))%mod;
  45. }
  46.  
  47. int findProbability(int n, int k, int mod_){
  48.     mod = mod_;
  49.     memset(memo,-1,sizeof memo);
  50.    
  51.     if(n <= 3*k+1) return dp(n,k);
  52.    
  53.     dp(3*k+1, k);
  54.  
  55.     vector<ll> x(2*k+2, 0), y(2*k+2,0);
  56.     for(int i = 0; i <= 2*k+1; i++){
  57.         x[i] = i + k;
  58.         y[i] = memo[i+k][k];
  59.         cout << x[i] << ' ' << y[i] << '\n';
  60.     }
  61.     return lagrange(n,x,y);
  62. }
  63. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement