dmkozyrev

shad.cpp

May 9th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. typedef int64_t Int;
  5.  
  6. std::vector<bool> simple(500001, true);
  7.  
  8. void factor(std::vector<int64_t> &a, int n) {
  9.     int64_t s = 0;
  10.     for(int i=2; i<=n; i++) {
  11.         s=0;
  12.         if (simple[i]) {
  13.             for(int t = i; t <= n; t *= i) {
  14.                 s += n/t;
  15.             }
  16.         }
  17.         a[i] = s;
  18.     }
  19.     return;
  20. }
  21.  
  22. Int solveFast(Int n, Int k) {
  23.     std::vector<int64_t> f1(500001, 0), f2(500001, 0), f3(500001, 0);
  24.     factor(f1, n);
  25.     factor(f2, k);
  26.     factor(f3, n-k);
  27.     f1[1] = 1;
  28.     for(int i=2; i<500001; i++) {
  29.         if (f2[i] != 0) {
  30.             f1[i] -= f2[i];
  31.         }
  32.         if (f3[i] != 0) {
  33.             f1[i] -= f3[i];
  34.         }
  35.     }
  36.     int64_t s=1;
  37.     for(int i=2; i<500001; i++) {
  38.         if (f1[i] != 0) {
  39.             s = (s*(f1[i]+1)) % 1000000007;
  40.         }
  41.     }
  42.     return s;
  43. }
  44.  
  45. Int solveSlow(Int n, Int k) {
  46.     if (k > n-k) return solveSlow(n, n-k);
  47.     Int c = 1;
  48.     for (Int i = 1; i <= k; ++i) {
  49.         c *= (n - i + 1);
  50.         c /= i;
  51.     }
  52.     Int sum = 1 + (c != 1);
  53.     for (Int i = 2; i * i <= c; ++i) {
  54.         Int j = c / i;
  55.         if (i * j == c) {
  56.             sum += 1 + (j != i);
  57.         }
  58.     }
  59.     return sum;
  60. }
  61.  
  62. void test(int N, int K) {
  63.     std::cout << "start test!" << std::endl;
  64.     for (int k = 0; k <= K; ++k) {
  65.         for (int n = k; n <= N; ++n) {
  66.             if (solveSlow(n, k) != solveFast(n, k)) {
  67.                 std::cout << "n = " << n << ", k = " << k
  68.                     << ", slow = " << solveSlow(n, k) << ", fast = " << solveFast(n, k) << std::endl;
  69.                 throw 1;
  70.             }
  71.         }
  72.     }
  73.     std::cout << "ok" << std::endl;
  74.     std::exit(0);
  75. }
  76.  
  77. int main()
  78. {
  79.     simple[0] = simple[1] = false;
  80.     for(int i = 2; i * i <= 500000; i++) {
  81.         if (!simple[i]) continue;
  82.        
  83.         for (int j=i*i; j<=500000; j+=i) {
  84.             simple[j] = false;
  85.         }
  86.        
  87.     }
  88.     // Тестирование
  89.     // test(20, 20);
  90.    
  91.     int n, k;
  92.     std::cin >> k >> n;
  93.     std::cout << solveFast(n, k) << std::endl;
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment