P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4345
題目大意
TTT組詢問,給出n,kn,kn,k求
∑i=0k(ni)\sum_{i=0}^{k}\binom{n}{i}i=0∑k?(in?)
對233323332333取模的值
1≤T≤105,1≤k≤n≤10181\leq T\leq 10^5,1\leq k\leq n\leq 10^{18}1≤T≤105,1≤k≤n≤1018
解題思路
因為模數很小,可以考慮用LucasLucasLucas定理,然后考慮怎么優化復雜度。
對于給出的n,kn,kn,k分成兩個部分,第一部分是由kkk前面若干段長度為PPP的整段構成,這一部分的答案我們發現對于C?nP??mP?×Cm%pn%pC_{\lfloor\frac{n}{P}\rfloor}^{\lfloor\frac{m}{P}\rfloor}\times C^{n\%p}_{m\% p}C?Pn???Pm???×Cm%pn%p?這兩個值,后面那一個值的和是確定的,是∑i=1kCn%pk\sum_{i=1}^kC_{n\%p}^k∑i=1k?Cn%pk?,前面那一部分的值我們可以遞歸下去計算。
然后第二部分是剩下的散段,這個部分我們也是自直接遞歸下去算就可以了
時間復雜度O(Tlog?n)O(T\log n)O(Tlogn)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll P=2333; ll n,k,t,S[P][P],C[P][P]; ll Lucas(ll n,ll k){if(!k)return 1ll;if(!C[n%P][k%P])return 0;return Lucas(n/P,k/P)*C[n%P][k%P]%P; } ll solve(ll n,ll k){if(k<0)return 0;if(n<P)return S[n][min(n,k)];ll tmp=solve(n/P,k/P-1)*S[n%P][n%P]%P;tmp=(tmp+solve(n%P,k%P)*Lucas(n/P,k/P)%P)%P;return tmp; } signed main() {C[0][0]=S[0][0]=1;for(ll i=1;i<P;i++)for(ll j=0;j<=i;j++)C[i][j]=((j?C[i-1][j-1]:0)+C[i-1][j])%P;for(ll i=1;i<P;i++){S[i][0]=C[i][0];for(ll j=1;j<=i;j++)(S[i][j]=S[i][j-1]+C[i][j])%=P;}scanf("%lld",&t);while(t--){scanf("%lld%lld",&n,&k);printf("%lld\n",solve(n,k));}return 0; }總結
以上是生活随笔為你收集整理的P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4389-付公主的背包【生成函数,多项
- 下一篇: 小欢喜全体演员表 全体演员详细介绍