Re: [閒聊] 每日leetcode

看板Marginalman作者 (6B)時間7月前 (2025/04/24 06:01), 編輯推噓2(200)
留言2則, 1人參與, 7月前最新討論串1405/1548 (看更多)
2338. 知道要怎麼做之後 自己刻出來還是好麻煩ㄛ== 我真的很崇拜chatgpt 還有gemini什麼的 # 先做質數表 做階乘跟inverse 質因數分解 抓去做牌組 加起來 這題步驟好多 有點cf那味惹 using ll = long long; class Solution { public: int mod = 1e9 + 7; int idealArrays(int n, int mv) { vector<int> primes = gen_primes(mv); ll res = 0; res += mv; // base^0 = 1 int mx = log(mv) / log(2); mx = min(mx, n-1); // max put vector<ll> fact(n+15, 0), inv(n+15, 0); n--; // space // 'n' space, put at most 'mx' // C n pick 0 + C n pick 1 + ... + C n pick mx n += 15; // n + factor num fact[0] = 1; for(int i = 1; i <= n; i++){ fact[i] = fact[i-1] * i % mod; } inv[n] = power(fact[n], mod - 2); for(int i = n-1; i >= 0; i--){ inv[i] = inv[i+1] * (i+1) % mod; } n -= 15; // space n -= 1; // comma auto&& factorize = [&](int time){ ll res = 1; int cnt = 0; for(int p: primes){ cnt = 0; while(time > 0 and time % p == 0){ cnt++; time /= p; } if(cnt) res = res * fact[cnt + n] % mod * inv[cnt] % mod * inv[n] % mod; if(p * p > time) break; } if(time > 1) res = res * (n + 1) % mod ; return res; }; for(int time = 2; time <= mv; time++){ res += factorize(time) * (int)(mv / time); res %= mod; } return res; } ll power(ll a, ll b){ ll res = 1; while(b) { if(b % 2) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } vector<int> gen_primes(int mx){ vector<bool> is_prime(mx + 1, true); vector<int> primes; is_prime[0] = false; is_prime[1] = false; for(int i = 2; i <= mx; i++){ if(is_prime[i]){ primes.emplace_back(i); for(int j = i*2; j <= mx; j += i){ is_prime[j] = false; } } } return primes; } }; ※ 引述《sixB (6B)》之銘言: : 2338. : 牌組真的好難 : 我快吐了 : 很認真看懂mod inv lc介面改這什麼ㄐㄅ 手機在problem拉半天找不到daily -- 很姆的咪 姆之咪 http://i.imgur.com/5sw7QOj.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.121.194 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1745445689.A.D69.html

04/24 08:36, 7月前 , 1F
大師
04/24 08:36, 1F

04/24 08:36, 7月前 , 2F
大師
04/24 08:36, 2F
文章代碼(AID): #1e2MCvrf (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1e2MCvrf (Marginalman)