求组合,卢卡斯方法
LL exp_mod(LL a, LL b, LL mod) { LL res = 1; while(b != 0) { if(b&1) res = (res * a) % mod; a = (a*a) % mod; b >>= 1; } return res; } LL Comb(LL a, LL b, LL mod) { if(a < b) return 0; if(a == b) return 1; if(b > a - b) b = a - b; LL ans = 1, ca = 1, cb = 1; for(LL i = 0; i < b; ++i) { ca = (ca * (a - i))%mod; cb = (cb * (b - i))%mod; } ans = (ca*exp_mod(cb, mod - 2, mod)) % mod; return ans; } LL Lucas(int n, int m, int mod) { LL ans = 1; while(n&&m&&ans) { ans = (ans*Comb(n%mod, m%mod, mod)) % mod; n /= mod; m /= mod; } return ans; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步