Guest User

c.cpp

a guest
Feb 25th, 2026
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #pragma comment(linker, "/stack:20000000")
  2. #pragma GCC optimize("Ofast")
  3. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
  4.  
  5. #include <stdio.h>
  6. #include <bits/stdc++.h>
  7. #include <x86intrin.h>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. using namespace __gnu_pbds;
  10. template <typename T> using ordered_set = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  11. template <typename T1, typename T2> using ordered_map = tree<T1, T2, std::less<T1>, rb_tree_tag, tree_order_statistics_node_update>;
  12.  
  13. using namespace std;
  14.  
  15.  
  16. #define pb push_back
  17. #define ppb pop_back
  18. #define mp make_pair
  19. #define fs first
  20. #define sc second
  21. #define abs(a) ((a) < 0 ? -(a) : (a))
  22. #define sqr(a) ((a) * (a))
  23.  
  24. typedef unsigned int uint;
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27.  
  28. inline pair<pair<bool, bool>, pair<string, bool> > useinout();
  29.  
  30. #ifdef SOL
  31. double starttime;
  32. #endif
  33.  
  34. void initialization() {
  35. #ifdef SOL
  36.     starttime = 1000. * clock() / CLOCKS_PER_SEC;
  37.     if (useinout().fs.fs)
  38.         freopen("input.txt", "r", stdin);
  39.     if (useinout().fs.sc)
  40.         freopen("output.txt", "w", stdout);
  41. #else
  42.     srand(__rdtsc());
  43.     const string file = useinout().sc.fs;
  44.     if (!file.empty()) {
  45.         freopen((file + ".in").c_str(), "r", stdin);
  46.         freopen((file + ".out").c_str(), "w", stdout);
  47.     } else
  48.     if(useinout().sc.sc) {
  49.         freopen("input.txt", "r", stdin);
  50.         freopen("output.txt", "w", stdout);
  51.     }
  52. #endif
  53. }
  54.  
  55. int solution();
  56.  
  57. void finish(int exitval) {
  58.     fflush(stdout);
  59. #ifdef SOL
  60.     fprintf(stderr, "\n-----------------\nexit value: %d\ntime: %.3lf ms\n-----------------\n", exitval, 1000. * clock() / CLOCKS_PER_SEC - starttime);
  61. #endif
  62. }
  63.  
  64. int main() {
  65.     initialization();
  66.     finish(solution());
  67.     return (0);
  68. }
  69.  
  70. const double eps = 1e-9;
  71. const int mod = (int) 1e+9 + 7;
  72. const double pi = acos(-1.);
  73. const int maxn = 1000100;
  74.  
  75.  
  76. ll binpow(ll a, ll b) {
  77.     ll ret = 1;
  78.     while(b) {
  79.         if(b & 1) ret = ret * a % mod;
  80.         a = a * a % mod;
  81.         b >>= 1;
  82.     }
  83.     return ret;
  84. }
  85.  
  86. ll dp[maxn];
  87. unordered_map<ll, ll> pd;
  88.  
  89. ll rec(ll n, ll k, ll a, ll b) {
  90.     if(n <= 1e5)
  91.         return dp[n];
  92.     if(pd.count(n)) return pd[n];
  93.     int ps[360] = {};
  94.     ll ret = 0;
  95.     ll ai = 1, aj = 1;
  96.     for(int j = 0; j <= k; j++) {
  97.         ps[j] = ((j ? ps[j - 1] : 0) + rec((n + 1) / 2 - j - 1, k, a, b) % mod * aj % mod * b % mod) % mod;
  98.         aj = aj * a % mod;
  99.     }
  100.     for(int i = 0; i < k; i++) {
  101.         ret = (ret + rec(n / 2 - i - 1, k, a, b) * ai % mod * b % mod * ps[k - 1 - i] % mod) % mod;
  102.         ai = ai * a % mod;
  103.     }
  104.     return pd[n] = ret;
  105. }
  106.  
  107. int solution() {
  108.  
  109.     ll n, k, a, b;
  110.     scanf("%lld%lld%lld%lld", &n, &k, &a, &b);
  111.  
  112.     ll ak = binpow(a, k);
  113.     dp[0] = 1;
  114.     for(int i = 1; i < k; i++)
  115.         dp[i] = dp[i - 1] * (a + b) % mod;
  116.     dp[k] = (binpow(a + b, k) + mod - ak) % mod;
  117.     for(int i = k + 1; i <= min(n, (ll)1e6 + 5); i++)
  118.         dp[i] = (dp[i - 1] * (a + b) - dp[i - k - 1] * b % mod * ak) % mod;
  119.  
  120.     if(k > 350) {
  121.         ll ans = (binpow(a + b, n) + mod - dp[n]) % mod;
  122.         printf("%lld\n", ans);
  123.     } else {
  124.         ll ans = (binpow(a + b, n) + mod - rec(n, k, a, b)) % mod;
  125.         printf("%lld\n", ans);
  126.     }
  127.  
  128.     return (0);
  129. }
  130.  
  131. inline pair<pair<bool, bool>, pair<string, bool> > useinout() {
  132.     return (mp(mp(0, 0), mp("", 0)));
  133. }
  134.  
  135. //by Andrey Kim
Advertisement
Add Comment
Please, Sign In to add comment